设计模式学习(三)------工厂方法模式
来源:互联网 发布:mobi格式软件ios 编辑:程序博客网 时间:2024/06/11 01:16
设计模式学习(三)——工厂方法模式
在前一篇文章中,谈到了简单工厂模式的缺点,就是它难以扩展,一旦添加新的产品就不得不修改工厂的逻辑。
工厂方法模式就是为了解决这个问题而产生的。与简单工厂模式不同的是,它将具体产品的制造放到了子类中,此时它不再负责生产具体的产品,而只是给出具体工厂必须实现的一个接口。
一个例子
public class Customer{ static void Main(string[] args) { //开设两个新的造车工厂 CarFactory benzcar = new BenzFactory(); CarFactory bmwcar = new BMWFactory(); //制造Benz汽车 Car benz = benzcar.CreateCarFactory(); benz.Print(); //制造BmW汽车 Car bmw = bmwcar.CreateCarFactory(); bmw.Print(); Console.Read(); }}public abstract class Car{ public abstract void Print();}//public class BMW:Car{ public BMW(){ } public override void Print() { Console.WriteLine("This is BMW!\n"); }}public class Benz:Car{ public Benz(){ } public override void Print() { Console.WriteLine("This is Benz!\n"); }}//抽象工厂类,相当于汽车制造总部,只负责提出计划,具体工作由子制造工厂完成public abstract class CarFactory{ public abstract Car CreateCarFactory() { }}//Benz制造工厂,只负责制造Benzpublic class BenzFactory:CarFactory{ public override Car CreateCarFactory() { return new Benz(); }}//BMW制造工厂,只负责制造BMWpublic class BMWFactory:CarFactory{ public override Car CreateCarFactory() { return new BMW(); }}
假设现在需要扩大产品线,生产丰田汽车,那么我们可以看出,抽象工厂类不需要做任何改变,只要添加一个丰田类和丰田汽车工厂类就可以了,代码如下:
public class Crown:Car{ public Crown(){ } public override void Print() { Console.WriteLine("This is Crown!\n"); }}public class CrownFactory:CarFactory{ public override Car CreateCarFactory() { return new Crown(); }}
什么时候应该使用工厂方法
- 类不能预测它必须创建哪一种类型的对象(汽车总部不知道顾客需要什么车)
- 类使用它的子类来制定来制定它要创建的对象(丰田工厂负责生产丰田汽车)
- 希望只有局部知晓那个类会被创建。
0 0
- 设计模式学习(三)工厂方法
- 设计模式学习(三)------工厂方法模式
- 设计模式学习笔记(三)工厂方法模式
- 设计模式(三) 工厂方法模式
- 设计模式学习(三) 工厂模式
- 设计模式学习笔记三:工厂方法模式
- Java设计模式(三):工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)
- 学习设计模式-方法工厂设计模式
- 设计模式之(三)---工厂方法模式
- C#设计模式(三)工厂方法模式
- PHP设计模式(三),工厂方法模式
- 设计模式(三)——工厂方法模式
- (三)Java设计模式之工厂方法模式
- 设计模式学习--工厂方法
- 设计模式学习(三) -- 工厂模式 Factory Pattern
- php设计模式学习系列(三)工厂模式
- 设计模式学习笔记(三)--工厂模式
- 设计模式入门学习之工厂模式(工厂方法模式)
- android4.2及之后开启手机多用户功能的笔记
- Mysql MERGE引擎简介
- Qt 读写Excel,并显示到tablewidget
- Java连接access
- Linux下eclipse编译C++动态链接库报错问题解决
- 设计模式学习(三)------工厂方法模式
- 黑马程序员-JAVA-交通灯模拟
- KMP
- (总结)Nginx配置文件nginx.conf中文详解
- (转)你只是看起来很努力
- invalidate和postInvalidate的区别
- openfire+asmack搭建的安卓即时通讯(一) 15.4.7
- openfire+asmack搭建的安卓即时通讯(二) 15.4.9
- openfire+asmack搭建的安卓即时通讯(三) 15.4.9