设计模式C#实现(九)——工厂方法模式和简单工厂
2015-09-18 10:36
891 查看
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
构成:
1.Product工厂方法创建的对象的接口
2.ConcreteProduct具体的产品,实现Product接口
3.Creator声明工厂方法,返回Product
4.ConcreteCreator实现/重写Creator的工厂方法,返回ConcreteProduct实例
UML类图:
![](http://images2015.cnblogs.com/blog/751394/201509/751394-20150917141535289-838378324.png)
实现
要生产的产品都实现一个接口
具体产品实现
工厂接口
具体工厂
使用
效果:
1.客户仅需处理Product接口,而不用知道它的具体实现是什么,符合针对接口编程的OO原则
2.要创建一个ConcreteProduct,就不得不创建一个ConcreteCreator
简单工厂:提供一个类,由它负责根据一定的条件创建某一具体类的实例,简单工厂不是一个设计模式(GOF没提,《HeadFirst设计模式》说像一种编程习惯)
UML类图:
![](http://images2015.cnblogs.com/blog/751394/201509/751394-20150918101023554-1791187424.png)
构成:
1.SimpleFactory简单工厂,根据条件(参数)创建并返回一个实例
2. Product产品接口
3.ConcreteProduct具体产品,实现Product接口
以生产披萨为例,因为Pizza有许多不同口味,SimpleFactory根据客户的口味生产不同Pizza
Pizza接口
不同口味的Pizza
客户选择可以提供条件来获得不同的实例
效果:
1.客户不再控制实例的创建,只需要使用,减少了客户的责任(单一责任原则?)
2.多个客户可以使用一个工厂,实现了代码复用
3.当实例的创建方法改变,并不影响客户(封装变化?)
4.当要添加产品就必须修改工厂,工厂方法模式一定程度上弥补了这个缺陷
构成:
1.Product工厂方法创建的对象的接口
2.ConcreteProduct具体的产品,实现Product接口
3.Creator声明工厂方法,返回Product
4.ConcreteCreator实现/重写Creator的工厂方法,返回ConcreteProduct实例
UML类图:
![](http://images2015.cnblogs.com/blog/751394/201509/751394-20150917141535289-838378324.png)
实现
要生产的产品都实现一个接口
interface Product { string getName(); }
具体产品实现
class Phone : Product { private string name = "MyPhone"; public string getName() { return name; } }
工厂接口
interface Creator { Product createProduct(); }
具体工厂
class PhoneCreator : Creator { public Product createProduct() { return new Phone(); } }
使用
class Program { static void Main(string[] args) { Creator creator = new PhoneCreator(); Product phone= creator.createProduct(); Console.WriteLine(phone.getName()); Console.ReadKey(); } }
效果:
1.客户仅需处理Product接口,而不用知道它的具体实现是什么,符合针对接口编程的OO原则
2.要创建一个ConcreteProduct,就不得不创建一个ConcreteCreator
简单工厂:提供一个类,由它负责根据一定的条件创建某一具体类的实例,简单工厂不是一个设计模式(GOF没提,《HeadFirst设计模式》说像一种编程习惯)
UML类图:
![](http://images2015.cnblogs.com/blog/751394/201509/751394-20150918101023554-1791187424.png)
构成:
1.SimpleFactory简单工厂,根据条件(参数)创建并返回一个实例
2. Product产品接口
3.ConcreteProduct具体产品,实现Product接口
以生产披萨为例,因为Pizza有许多不同口味,SimpleFactory根据客户的口味生产不同Pizza
class SimpleFactory { public Pizza getPizza(string type) { switch (type.Trim().ToLower()) { case "cheesepizza": return new CheesePizaa(); break; case "clampizza": return new ClamPizza(); break; default: return new NormalPizza(); break; } } }
Pizza接口
abstract class Pizza { virtual public string getName() { return "NormalPizza"; } }
不同口味的Pizza
class CheesePizaa : Pizza { override public string getName() { return "CheesePizaa"; } }
class ClamPizza : Pizza { override public string getName() { return "ClamPizza"; } }
class NormalPizza:Pizza { }
客户选择可以提供条件来获得不同的实例
class Program { static void Main(string[] args) { SimpleFactory factory = new SimpleFactory(); Pizza cheesePiz = factory.getPizza("CheesePizza"); Pizza clamPiz = factory.getPizza("ClamPizza"); Pizza NormalPiz = factory.getPizza(""); Console.WriteLine(cheesePiz.getName()); Console.WriteLine(clamPiz.getName()); Console.WriteLine(NormalPiz.getName()); Console.ReadKey(); } }
效果:
1.客户不再控制实例的创建,只需要使用,减少了客户的责任(单一责任原则?)
2.多个客户可以使用一个工厂,实现了代码复用
3.当实例的创建方法改变,并不影响客户(封装变化?)
4.当要添加产品就必须修改工厂,工厂方法模式一定程度上弥补了这个缺陷
相关文章推荐
- c#之is和as的区别用法
- 抄 c#邮件发送 关于邮箱的端口号及SMTP 服务器
- 设计模式C#实现(八)——原型模式
- c#委托实例化和调用语句
- 虚拟串口 vspd + C#2.0 测试串口 收发数据
- C# 抓取程序运行路径
- C# Assert Method
- C# 自带的界面控件 chart,初步使用体验
- C#多线程学习 之 线程池[ThreadPool](转)
- C#编程总结 dynamic(转)
- C#方便操作数据总结
- C#中的扩展方法
- C#内存操作
- C#关于使用枚举遇到的问题----Parse()方法使用注意
- .NET基础--索引器
- C#中使用强制类型实现字符串和ASCII码之间的转换
- C#.net 多级cookie写入读取代码,一级、二级域名
- C#实现字符串数组的TreeMap排序
- C#关于使用枚举遇到的问题----Type运算符使用的必要性
- C# AttributeUsage