结构           
意图         提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
适用性    
  • 一个系统要独立于它的产品的创建、组合和表示时。
  • 一个系统要由多个产品系列中的一个来配置时。
  • 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
  • 当你提供一个产品类库,而只想显示它们的接口而不是实现时。
 using System;

     // These classes could be part of a framework,
// which we will call DP
// =========================================== abstract class DPDocument
{
abstract public void Dump();
} abstract class DPWorkspace
{
abstract public void Dump();
} abstract class DPView
{
abstract public void Dump();
} abstract class DPFactory
{
abstract public DPDocument CreateDocument();
abstract public DPView CreateView();
abstract public DPWorkspace CreateWorkspace();
} abstract class DPApplication
{
protected DPDocument doc;
protected DPWorkspace workspace;
protected DPView view; public void ConstructObjects(DPFactory factory)
{
// Create objects as needed
doc = factory.CreateDocument();
workspace = factory.CreateWorkspace();
view = factory.CreateView();
} abstract public void Dump(); public void DumpState()
{
if (doc != null) doc.Dump();
if (workspace != null) workspace.Dump();
if (view != null) view.Dump();
}
} // These classes could be part of an application
class MyApplication : DPApplication
{
MyFactory myFactory = new MyFactory(); override public void Dump()
{
Console.WriteLine("MyApplication exists");
} public void CreateFamily()
{
MyFactory myFactory = new MyFactory();
ConstructObjects(myFactory);
}
} class MyDocument : DPDocument
{
public MyDocument()
{
Console.WriteLine("in MyDocument constructor");
} override public void Dump()
{
Console.WriteLine("MyDocument exists");
}
} class MyWorkspace : DPWorkspace
{
override public void Dump()
{
Console.WriteLine("MyWorkspace exists");
}
} class MyView : DPView
{
override public void Dump()
{
Console.WriteLine("MyView exists");
}
} class MyFactory : DPFactory
{
override public DPDocument CreateDocument()
{
return new MyDocument();
}
override public DPWorkspace CreateWorkspace()
{
return new MyWorkspace();
}
override public DPView CreateView()
{
return new MyView();
}
} /// <summary>
/// Summary description for Client.
/// </summary>
public class Client
{
public static int Main(string[] args)
{
MyApplication myApplication = new MyApplication(); myApplication.CreateFamily(); myApplication.DumpState(); return ;
}
}

工厂模式

名称 Factory Method
结构
意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。
适用性
  • 当一个类不知道它所必须创建的对象的类的时候。
  • 当一个类希望由它的子类来指定它所创建的对象的时候。
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
 using System;

     // These two classes could be part of a framework,
// which we will call DP
// =============================================== class DPDocument
{ } abstract class DPApplication
{
protected DPDocument doc; abstract public void CreateDocument(); public void ConstructObjects()
{ // Create objects as needed
// . . . // including document
CreateDocument();
}
abstract public void Dump();
} // These two classes could be part of an application
// ================================================= class MyApplication : DPApplication
{
override public void CreateDocument()
{
doc = new MyDocument();
} override public void Dump()
{
Console.WriteLine("MyApplication exists");
}
} class MyDocument : DPDocument
{ } /// <summary>
/// Summary description for Client.
/// </summary>
public class Client
{
public static int Main(string[] args)
{
MyApplication myApplication = new MyApplication(); myApplication.ConstructObjects(); myApplication.Dump(); return ;
}
}

工厂方法

最新文章

  1. logstash输出到influxdb
  2. Watir、Selenium2、QTP区别
  3. 细说LastLogonTimeStamp
  4. [UML]转:UML类图集中关系的总结
  5. 腾讯微博模拟登陆+数据抓取(java实现)
  6. [CCF2015.12]题解
  7. gb2312和UTF-8的区别
  8. Servlet 下载文件
  9. kubernetes学习第一篇-k8s安装以及HelloWorld
  10. [蓝桥杯]PREV-22.历届试题_国王的烦恼
  11. mysql错误集合
  12. linux下安装oracle及weblogic
  13. 检测到在集成的托管管道模式下不适用的ASP.NET设置
  14. ios 根据scrollview滑动的偏移计算滑动到第几页算法(不同需求不同计算)
  15. onsrcoll和scrollTop兼容与实现
  16. Java工程师笔试题整理[校招篇]
  17. python学习之路1(基本语法元素)
  18. Android学习记录(1)—Android中XML文件的序列化生成与解析
  19. java 使用htmlunit模拟登录爬取新浪微博页面
  20. iOS学习笔记06-手势识别

热门文章

  1. elasticsearch 5.x 系列之一 开始安装啦
  2. 生产-消费模式的synchronized和lock实现(十)
  3. Android面试收集录15 Android Bitmap压缩策略
  4. 集合源码分析之 HashSet
  5. 3670: [Noi2014]动物园
  6. ios开发3.5和4.0寸屏幕自适应中的一点问题
  7. 【Spiral Matrix II】cpp
  8. Linux忘记root密码的解决办法
  9. parameter localparam define的区别
  10. 课时17:函数:Python的乐高积木