Unity常用的设计模式_工厂模式系列之抽象工厂模式
来源:互联网 发布:什么软件可以抠图换景 编辑:程序博客网 时间:2024/05/16 07:41
在工厂方法模式中,工厂只负责生产具体的产品,每一个具体的工厂对应着一个具体的产品,工厂方法也具有唯一性,如果有时候我们需要一个工厂方法提供多个产品而不是一个单一的产品,例如:海尔品牌不止生产海尔TV,还生产海尔冰箱,海尔空调等等,如果使用工厂方法模式就需要产生很多个工厂类来实现,而抽象工厂模式只需要一个工厂类即可生产一个品牌的多种产品。所以抽象工厂模式比工厂方法模式更加简单,有效率。
抽象工厂模式
1.抽象工厂模式动机
可以看出,如果使用工厂方法模式,就需要创建20个具体工厂类才能生产上图的所有产品,如果使用抽象工厂模式,只需要4个类,分别是三星厂,松下厂,TCL厂和海尔厂。
2.抽象工厂模式定义
抽象工厂模式就是定义一个可以生产对象的接口,让子类决定要生产哪一个类的接口,工厂方法模式让类的实例化程序延迟到子类中实行。
3.抽象工厂模式的结构图
AbstractFactory(抽象工厂)
△抽象工厂中可一个定义各组方法,每组方法对应着一个产品等级结构(一种类型如风扇)。
ConcreteFactoryA和ConcreteFactoryB(具体工厂)
△实现抽象工厂中的生成抽象产品方法,生产一组具体产品,这类产品形成一个产品族(一个品牌,如TCL),每个产品都位于某个产品的等级结构中。
AbstractProductA和AbstractProductB(抽象产品A和抽象产品B)
△为等级结构中的成员声明抽象业务方法。
ConcreteProduct (A1/A2/B1/B2)(具体产品)
△具体产品,具有唯一的产品族和产品等级结构属性。
4.抽象工厂模式主要代码(一个简单的例子)
抽象产品类
(电视)TV.cs
public interface TV{public void Play();}
(风扇)Fan.cs
public interface Fan{public void Play();}具体产品类
(海尔电视)HaiErTV.cs
public class HaiErTV : TV{public void Play(){Console.WriteLine("海尔电视");}}
(海尔风扇)HaiErFan.cs
public class HaiErFan : Fan{public void Play(){Console.WriteLine("海尔风扇");}}
(TCL电视)TCLTV.cs
public class TCLTV : TV{public void Play(){Console.WriteLine("TCL电视");}}
(TCL风扇)TCLFan.cs
public class TCLFan : Fan{public void Play(){Console.WriteLine("TCL风扇");}}
抽象工厂类
AbsractFactory.cs
public interface AbstractFactory{public TV CreateTV();public Fan CreateFan();}
(海尔)HaiErFactory.cs
public class HaiErFactory : AbstractFactory{public TV CreateTV(){return new HaiErTV();}public Fan CreateFan(){return HaiErFan();}}
(TCL)TCLFactory.cs
public class TCLFactory : AbstractFactory{public TV CreateTV(){return new TCLTV();}public Fan CreateFan(){return TCLFan();}}
测试
AbstractFactory factory;/*定义抽象工厂*/TV tv;/*定义抽象电视*/Fan fan;/*定义抽象风扇*/factory = new HaiErFactory();tv = factory.CreateTV();tv.Play();/*海尔电视*/fan = factory.CreateFan();fan.Play();/*海尔风扇*/
优点
△ 隔离了具体类的生成,是的客户端并不需要知道什么被创建。由于这种隔离,更换了一个具体工厂就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需要改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。实现高内聚低耦合。
△ 当一个产品族中的多个对象被设计成一起工作的时候,抽象工厂模式能够保证客户端只使用同一个产品族中的对象。
△ 增加新的具体工厂和产品族很方便,无需要修改已有系统。
缺点
△ 在添加新产品对象是,难以拓展抽象工厂来生产新种类的产品,这是因为抽象工厂角色中规定了所有可能被创建的产品集合。要支持新种类的产品就意味着要对该接口进行拓展,需要修改代码。
6.参考
《设计模式》主编:刘伟
http://blog.csdn.net/zhengzhb/article/details/7359385/
- Unity常用的设计模式_工厂模式系列之抽象工厂模式
- Unity常用的设计模式_工厂模式系列之简单工厂模式
- Unity常用的设计模式_工厂模式系列之工厂方法模式
- 设计模式系列之抽象工厂模式
- 常用设计模式之工厂方法模式、抽象工厂模式
- 常用设计模式之抽象工厂模式
- 设计模式之工厂模式系列(简单工厂,工厂模式,抽象工厂模式)
- 设计模式系列之 抽象工厂
- 【设计模式系列】--抽象工厂
- 常用Java设计模式系列(5)- 简单工厂、工厂方法模式和抽象工厂模式
- Java设计模式_抽象工厂模式
- 大话设计模式_抽象工厂模式
- 设计模式_抽象工厂模式
- 设计模式03_抽象工厂模式
- 设计模式04_抽象工厂模式
- 设计模式_抽象工厂模式
- 设计模式05_抽象工厂模式
- java设计模式_抽象工厂模式
- c++编译zlib3--7.13
- react-native实现大图预览(支持手势缩放)
- 217. Contains Duplicate
- vue-cli快速创建项目
- 【知识点】 ---线段树的常用操作
- Unity常用的设计模式_工厂模式系列之抽象工厂模式
- SpringMVC + MyBatis + Mysql + Redis(作为二级缓存) 配置
- Ubuntu安装Nginx
- CSS3过度
- 对象数组的排序以及对象原型构建法
- 【cocos2d-js教程】cocos2d-js http网络请求
- Kafka 配置说明
- Java并发编程之CountDownLatch
- nginx.conf的配置多个目录