2016.12.19 学习日记-工厂方法模式
2016-12-19 21:33
155 查看
周末联系了上周所学的四个模式,今天继续开始新模式的学习,唉,总是记不住这是为啥呢。周四得考大物了,亚历山大啊
工厂方法模式(Factory Method)
工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
角色结构:
抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。在上图中有两个这样的角色:BulbCreator与TubeCreator。
抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。
具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
UML类图(实例类图):
工厂方法模式听名字便知道其与简单工厂模式应该有很大的渊源,先看一看实例,在来探讨其中差别,本次实例与上一次简单工厂方法实例相同,更能区分出两者不同。
实例:
某电视机厂专为各知名电视机品牌代工生产各类电视机,当需要海尔牌电视机时只需要在调用该工厂的工厂方法时传入参数“Haier”,需要海信电视机时只需要传入参数“Hisense”,工厂可以根据传入的不同参数返回不同品牌的电视机。现使用简单工厂模式来模拟该电视机工厂的生产过程。
将简单工厂模式修改为工厂方法模式。
虚拟产品类
TV.cs
具体产品类HaierTV.cs
具体产品类HisenseTV.cs
抽象工厂类TVFactory.cs
具体工厂类HaierFactory,cs
具体工厂类HisenseFactory,cs
Program.cs
由实例代码可以看出,工厂方法模式与简单工厂方法的虚拟产品类具体产品类完全相同,区别在于工厂类。工厂方法模式用一个虚拟工厂接口,让其子类决定实例化哪一个类。
简单工厂模式最大的优点在于工厂类中包含了必要的逻辑判断,根据客户的选择条件动态的实例化相关的类,对于客户端来说,去除了与具体产品的依赖。但在上一次也说过,简单工厂模式违背了开放-封闭原则。工厂方法模式便对其进行了优化。
工厂方法模式实现时,客户端需要决定实现哪一个工厂来实现TV类,选择判断问题还是存在的,但是,工厂方法模式将简单工厂的内部逻辑判断转移到了客户端代码中。你想要加功能,原本需要修改工厂类,现在是扩展类、修改客户端。工厂方法克服了简单工厂模式违背开闭原则的缺点,又保持了封装对象创建的过程。。
工厂方法模式(Factory Method)
工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
角色结构:
抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。在上图中有两个这样的角色:BulbCreator与TubeCreator。
抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。
具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
UML类图(实例类图):
工厂方法模式听名字便知道其与简单工厂模式应该有很大的渊源,先看一看实例,在来探讨其中差别,本次实例与上一次简单工厂方法实例相同,更能区分出两者不同。
实例:
某电视机厂专为各知名电视机品牌代工生产各类电视机,当需要海尔牌电视机时只需要在调用该工厂的工厂方法时传入参数“Haier”,需要海信电视机时只需要传入参数“Hisense”,工厂可以根据传入的不同参数返回不同品牌的电视机。现使用简单工厂模式来模拟该电视机工厂的生产过程。
将简单工厂模式修改为工厂方法模式。
虚拟产品类
TV.cs
public class TV { public virtual void play() { } }
具体产品类HaierTV.cs
class HaierTV : TV { public override void play() { Console.WriteLine("HaierTV playing--"); } }
具体产品类HisenseTV.cs
class HisenseTV : TV { public override void play() { Console.WriteLine("HisenseTV playing--"); } }
抽象工厂类TVFactory.cs
public interface TVFactory { TV CreateTV(); }
具体工厂类HaierFactory,cs
class HaierFactory : TVFactory { public TV CreateTV() { return new HaierTV(); } }
具体工厂类HisenseFactory,cs
class HisenseFactory : TVFactory { public TV CreateTV() { return new HisenseTV(); } }
Program.cs
class Program { static void Main(string[] args) { TVFactory factory = new HaierFactory(); TV tv1 = factory.CreateTV(); tv1.play(); factory = new HisenseFactory(); tv1 = factory.CreateTV(); tv1.play(); Console.ReadKey(); } }
由实例代码可以看出,工厂方法模式与简单工厂方法的虚拟产品类具体产品类完全相同,区别在于工厂类。工厂方法模式用一个虚拟工厂接口,让其子类决定实例化哪一个类。
简单工厂模式最大的优点在于工厂类中包含了必要的逻辑判断,根据客户的选择条件动态的实例化相关的类,对于客户端来说,去除了与具体产品的依赖。但在上一次也说过,简单工厂模式违背了开放-封闭原则。工厂方法模式便对其进行了优化。
工厂方法模式实现时,客户端需要决定实现哪一个工厂来实现TV类,选择判断问题还是存在的,但是,工厂方法模式将简单工厂的内部逻辑判断转移到了客户端代码中。你想要加功能,原本需要修改工厂类,现在是扩展类、修改客户端。工厂方法克服了简单工厂模式违背开闭原则的缺点,又保持了封装对象创建的过程。。
相关文章推荐
- Jsp 学习日记(2004-9-28 农历八月十五 晴)
- LINUX开发学习日记(第一部)(UNIX环境高级编程)
- [学习日记]进程、线程和模块
- asp.net 学习日记数据分页
- Oracle 学习日记(二)
- Shark工作流学习日记
- [学习日记]VB图像处理之像素的获取和输出
- [学习日记]重构简易RSSREADER的UML类图
- Tomcat代码学习日记系列.
- [Struts]学习日记1 - 一个简单的例子
- java学习日记(线程)
- [学习日记]对SOAP请求的头添加内容的方法
- [学习日记]对SOAP头内添加信息的验证,可实现对请求WEB服务进行身份验证。
- [学习日记]在文本框最前面一行追加新内容的一个SUB
- [Struts]学习日记2 - 增加一些验证
- 学习日记--8.5--linux初装
- 日记:2004年10月08日 读《向微软学习什么》
- [学习日记]对控件的继承和重载
- oracle 学习日记(一)
- Java2 学习日记 2005 10 10