抽象工厂模式

定义

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

作用

在工厂方法模式中,我们的具体创建者每次使用都只能创建一个同类型的对象,假如我们现在需要的是多个不同类型的对象,工厂方法就满足不了需求了。这时我们可以把多个工厂方法组合到一个类,这就是抽象工厂模式,它就是专门用来创建多个产品,也可以说是创建产品家族的。

优点

  1. 允许客户使用抽象的接口创建一组相关产品,而不需要知道(或者关心)产出的具体产品是什么,这样客户就可以从具体的产品中解耦出来。
  2. 一个具体工厂可以创建多个产品,与工厂方法模式相比,可以少产生具体工厂的类数量。
  3. 易于交换产品系列,只要更换具体工厂,就可以改变这个产品系列。

缺点

  1. 抽象工厂是使用组合的方式把工厂方法集合到一个类中,当新增一个产品家族成员时就要修改抽象工厂类及其下面的具体工厂类,所以它的扩展性比较差。
  2. 每新增一个产品子类都要创建一个类,当产品子类过多时会产生很多类,导致系统复杂性加大。

使用场景

  1. 当需要创建产品家族,或者需要想让创建的产品集合起来时使用。
  2. 当系列产品不固定,在以后可能会增加整个系列产品时使用。

结构讲解

代码说明:

抽象工厂类包含所有产品创建的抽象方法。

abstract class AbstractFactory{    public abstract AbstractProductA CreateProductA();    public abstract AbstractProductB CreateProductB();}

具体的工厂实现特定产品对象。通常在运行时创建ConcreteFactory类的实例。因此,客户端可以通过使用不同的具体工厂实现创建不同的产品对象。

class ConcreteFactory1 : AbstractFactory{    public override AbstractProductA CreateProductA()    {        return new ProductA1();    }    public override AbstractProductB CreateProductB()    {        return new ProductB1();    }}class ConcreteFactory2 : AbstractFactory{    public override AbstractProductA CreateProductA()    {        return new ProductA2();    }    public override AbstractProductB CreateProductB()    {        return new ProductB2();    }}

抽象产品类

//abstract class AbstractProductA{}abstract class AbstractProductB{    public abstract void Interact(AbstractProductA a);}

具体产品实现类,继承抽象产品类,实现具体产品的方法

class ProductA1 : AbstractProductA{}class ProductB1 : AbstractProductB{    public override void Interact(AbstractProductA a)    {        Console.WriteLine(this.GetType().Name +            " interacts with " + a.GetType().Name);    }}class ProductA2 : AbstractProductA{}class ProductB2 : AbstractProductB{    public override void Interact(AbstractProductA a)    {        Console.WriteLine(this.GetType().Name +            " interacts with " + a.GetType().Name);    }}

客户端类

class Client{    private AbstractProductA AbstractProductA;    private AbstractProductB AbstractProductB;    // Constructor     public Client(AbstractFactory factory)    {        AbstractProductB = factory.CreateProductB();        AbstractProductA = factory.CreateProductA();    }    public void Run()    {        AbstractProductB.Interact(AbstractProductA);    }}

客户端调用

AbstractFactory factory1 = new ConcreteFactory1();Client c1 = new Client(factory1);c1.Run();AbstractFactory factory2 = new ConcreteFactory2();Client c2 = new Client(factory2);c2.Run();Console.Read();

抽象工厂模式_常用设计模式--抽象工厂模式相关推荐

  1. 设计模式 原型模式_创新设计模式:原型模式

    设计模式 原型模式 原型模式用于创建对象的副本. 这种模式非常有用,特别是当从头开始创建对象的成本很高时. 与builder , factory和abstract factory模式相比,它不会从头开 ...

  2. Android常用设计模式之工厂模式理解

    Android常用设计模式之工厂模式 前言 工厂模式 普通工厂模式 普通工厂模式例子 简单工厂模式总结: 简单工厂模式优缺点: 抽象工厂模式 抽象工厂模式的例子 抽象工厂模式小结 抽象工厂模式优缺点 ...

  3. Unity3D常用设计模式之工厂模式

    Unity3D常用设计模式<工厂模式>   工厂模式(Factory Pattern)是游戏开发中比较常用的设计模式.这种类型的设计模式属于创建型模式,它提供了一种创建对象实例的最佳方式. ...

  4. 初学Java常用设计模式之——原型模式

    声明:转载请附上原文链接 提示:标题序号从3开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之--工厂模式 序号从2开始. 标题后面之所以加上了解,是因为相对 ...

  5. Android常用设计模式之Builder模式理解

    Android常用设计模式之Builder模式 1 单例模式 2 Builder模式 Builder模式的应用场景 总结 1 单例模式 单例模式之前有详细的介绍,可移步到链接: 常见的单例模式及其特点 ...

  6. Java常用设计模式————抽象工厂模式

    简介 每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例. 与工厂方法模式的区别 工厂方法模式针对的是一个产品等级结构,而抽象工厂模式针对的是多个产品等级结构,因此抽象工厂模式在结构上要比工厂方 ...

  7. 常用设计模式-抽象工厂

    模式简介 工厂模式主要是为创建对象提供了接口.工厂模式按照<Java与模式>中的提法分为三类: 1. 简单工厂模式(Simple Factory) 2. 工厂方法模式(Factory Me ...

  8. 初学Java常用设计模式之——工厂模式

    声明:转载请附上原文链接 提示:标题序号从2开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之--单例模式 序号从1开始 2. 工厂模式(常用) ⼯⼚模式介绍 ...

  9. mave工程中的一个类调用另一个聚合工程的一个类_谈谈设计模式:建造者模式在jdk中的体现,它和工厂模式区别?...

    背景 建造模式(Builder模式) 假如有一个需求:盖房子,盖房子过程是一致的:打桩.砌墙.封顶.但是房子是各式各样的,最后盖出来的房子可能是高楼或别墅. 根据直接的思路,不用设计模式思想,我们也许 ...

最新文章

  1. android:使用Messenger进行进程间通信(一)
  2. uva 1416 (SPFA) **月赛第E题的原题**
  3. 八种 WebSocket 框架的性能比较
  4. [视频教程] 如何在docker环境下的纯净ubuntu系统中安装最新版nginx
  5. 学java教程之String类
  6. 【C】C语言结构体指针的语法
  7. 数据集转换_为什么LSTM看起来那么复杂,以及如何避免时序数据的处理差异和混乱...
  8. 一文读懂类加载机制 --- ClassLoader
  9. 企业即时通讯一个全新行业的诞生
  10. linux alias使用
  11. 太赞了!超炫的页面切换动画效果【附源码下载】
  12. jsp过滤器一点小结
  13. 5G及移动边缘计算(MEC)学习笔记(2)
  14. 从RTS游戏看游戏开发-2
  15. Golang Time互转秒、毫秒
  16. 微信如何创建自己的小程序?
  17. ASK、OOK、FSK、GFSK 学习
  18. Failed to start component [Connector[HTTP/1.1-20001]]报错
  19. 一种简单、安全的Dota全图新思路 作者:LC 【转】
  20. HTML搜索结果显示,百度搜索结果如何显示你的网站logo及官网?

热门文章

  1. Java 项目JDBC 链接数据库中会出现的错误
  2. 微服务架构——不是免费的午餐
  3. c语言:找出1到4000中,数字的各位数之和能被4整除的数有多少个?
  4. 2015年十佳IDC评选结果:50强名单揭晓
  5. 设置***遇到一个小问题
  6. Class com.googlecode.jsonplugin.JSONWriter ca...
  7. 为什么插入数据普通PC比服务器更快?
  8. RHEL/CentOS下的VLAN设置
  9. 数据显示:7月份BCH链上交易量较3月份激增逾900%
  10. Windows Server 2016-活动目录NTP时间同步