在工厂方法模式中,工厂只负责生产具体的产品,每一个具体的工厂对应着一个具体的产品,工厂方法也具有唯一性,如果有时候我们需要一个工厂方法提供多个产品而不是一个单一的产品,例如:海尔品牌不止生产海尔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();/*海尔风扇*/

5.总结

优点

△隔离了具体类的生成,是的客户端并不需要知道什么被创建。由于这种隔离,更换了一个具体工厂就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需要改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。实现高内聚低耦合。

△当一个产品族中的多个对象被设计成一起工作的时候,抽象工厂模式能够保证客户端只使用同一个产品族中的对象。

△增加新的具体工厂和产品族很方便,无需要修改已有系统。

缺点

△在添加新产品对象是,难以拓展抽象工厂来生产新种类的产品,这是因为抽象工厂角色中规定了所有可能被创建的产品集合。要支持新种类的产品就意味着要对该接口进行拓展,需要修改代码。

6.参考

《设计模式》主编:刘伟

抽象工厂模式 java实例 tclhaier_Unity常用的设计模式_工厂模式系列之抽象工厂模式...相关推荐

  1. java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...

  2. Java开发中常用的设计模式-单例模式

    单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式. Java开发中常用的设计模式-单例模式 单例模式有3个特点: 单例类只有一个实例对象: 该单例对象必须 ...

  3. Java实现二十三种设计模式(五)—— 十一种行为型模式 (中)——解释器模式、迭代器模式、中介者模式、备忘录模式

    Java实现二十三种设计模式(五)-- 十一种行为型模式 (中)--解释器模式.迭代器模式.中介者模式.备忘录模式 一.解释器模式 我国 IT 界历来有一个汉语编程梦,虽然各方对于汉语编程争论不休,甚 ...

  4. 【设计模式_青春版】结构型|外观模式

    文章目录 外观模式(结构型) 外观模式又名门面模式 结构 外观模式案例 代码实现 优缺点 优点 缺点 使用场景 在tomcat中的 外观模式(结构型) 外观模式又名门面模式 是一种通过为多个复杂的子系 ...

  5. 工厂方法模式java实例,设计模式之工厂方法模式实例(Java)

    海尔工厂(Haier)生产海尔空调(HaierAirCondition),美的工厂(Midea)生产美的空调(MideaAirCondition) .使用工厂方法模式描述该场景,绘制类图并编程实现. ...

  6. java 耦合度_Java第三十八天,Spring框架系列,使用工厂模式降低程序耦合度

    一.什么是耦合 程序之间的依赖关系: ①类之间的依赖 ②方法之间的依赖 注意: 不可能完全的消除依赖关系,而只能是降低程序之间的依赖关系 二.解耦 降低程序之间的依赖关系: 1.解决类之间的依赖关系: ...

  7. java开发中常用的算法_总结一下项目开发过程中常用的到的一些加密算法。

    一般常用的有: MD5.SHA算法:代码如下 Java代码 /* * Copyright (c) 2008 * All rights reserved. */ packagecn.com.jody.w ...

  8. java 常用 函数式接口_「java8系列」神奇的函数式接口

    前言 在上一篇Lambda的讲解中我们就提到过函数式接口,比如:Consumer consumer = (s) -> System.out.println(s);其中Consumer就是一个函数 ...

  9. java性能最好的mvc框架_详解Spring MVC的异步模式(高性能的关键)

    什么是异步模式 要知道什么是异步模式,就先要知道什么是同步模式,先看最典型的同步模式: 浏览器发起请求,Web服务器开一个线程处理,处理完把处理结果返回浏览器.好像没什么好说的了,绝大多数Web服务器 ...

最新文章

  1. navicat for mysql如何在更新记录时自动记录更新时间
  2. 设计模式C++实现(2)——策略模式
  3. 使用Picasso实现图片圆角和图片圆形
  4. 【原】网页程序学习Linux利器-----jsuix
  5. 【转载保存】匿名内部类中this的使用
  6. 南通大学计算机系本二,2012年南通大学计算机科学与技术学院江苏省内第二批本科(院校代码:1301)...
  7. php多个参数绑定,php – 如何绑定多个参数到MySQLi查询
  8. 88. [ExtJS2.1教程-5]ToolBar(工具栏)
  9. docker安装tomcat下的日志查看
  10. Vagrant搭建开发环境1--总体介绍
  11. 如何找到Google浏览器扩展程序在本地文件夹中的位置?
  12. 关于IBM刀片服务器
  13. 夏普科学计算机标准差,夏普比率-标准差-贝他系数
  14. 生信分析矫正P值_万字长文+诚意满满 | 单细胞转录组分析最佳思路综述
  15. 星星之火OIer:NOIP2018完爆总结
  16. androidstudio身高预测app
  17. 控制极限(UCL,LCL) 和规格极限(USL,LSL)
  18. 为即将的工作做准备~
  19. 编辑距离(Edit Distance) 一文读懂(Python实现)
  20. 关于调整部分车站互联网、电话订票起售时间的公告

热门文章

  1. 伍六七带你学算法——栈的使用
  2. 2022-2028年中国果壳活性炭行业市场发展调研及竞争战略分析报告
  3. 2022-2028年中国未硫化橡胶制品行业市场运行格局及未来前景展望报告
  4. 2022-2028年中国文化创意产业园区域发展模式与产业整体规划研究报告
  5. Git 常用操作(6)- 推送到远程仓库(git push)删除远程分支(git push origin --delete)
  6. 【算法基础】时间复杂度:大O阶方法
  7. 机房收费系统总结【5】——无用功
  8. PyTorch学习之六个学习率调整策略
  9. Linux 交叉编译简介
  10. 空间点像素索引(二)