抽象工厂 简述

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

抽象工厂模式结构

抽象工厂模式包含如下角色:

AbstractFactory:抽象工厂

ConcreteFactory:具体工厂

AbstractProduct:抽象产品

Product:具体产品

代码实例

/**
* 抽象工厂
*
* @author kaifeng
* @date 2018/8/19
*/
public abstract class AbstractCarFactory {
/**
* 获取相应的car对象
*
* @param carType car类型
* @return ICar
*/
public abstract ICar getCar(CarType carType);
} /**
* 具体实现工厂
*
* @author kaifeng
* @date 2018/8/19
*/
public class CarConcreteFactory extends AbstractCarFactory {
/**
* 获取相应的car对象
*
* @param carType car类型
* @return ICar
*/
@Override
public ICar getCar(CarType carType) {
if (carType == CarType.CAR) {
return new Car();
}
if (carType == CarType.BUS) {
return new Bus();
}
if (carType == CarType.SUV) {
return new Suv();
}
return null;
}
} /**
* 生成工厂对象
*
* @author kaifeng
* @date 2018/8/19
*/
public class AbstractFactoryProducer {
public static AbstractCarFactory getFactory(String factoryType) {
if ("car".equalsIgnoreCase(factoryType)) {
return new CarConcreteFactory();
}
return null;
}
} /**
* 抽象工厂demo
*
* @author kaifeng
* @date 2018/8/19
*/
public class AbatractFactoryDemo {
public static void main(String[] args) {
//获取产品工厂
AbstractCarFactory abstractCarFactory = AbstractFactoryProducer.getFactory("car"); //获取产品为car的对象
ICar car = abstractCarFactory.getCar(CarType.CAR);
System.out.println(car.getCarName()); //获取产品为bus的对象
ICar bus = abstractCarFactory.getCar(CarType.BUS);
System.out.println(bus.getCarName()); //获取产品为SUV的对象
ICar suv = abstractCarFactory.getCar(CarType.SUV);
System.out.println(suv.getCarName());
}
}

优点

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

当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。这对一些需要根据当前环境来决定其行为的软件系统来说,是一种非常实用的设计模式。

增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

缺点

在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。

适用场景

一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。

系统中有多于一个的产品族,而每次只使用其中某一产品族。

属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。

系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。

最新文章

  1. 【转】WPF 给DataGridTextColumn统一加上ToolTip
  2. 移动设备如何打开RMS加密的文档
  3. Newtonsoft.Json动态过滤属性
  4. 设计模式:享元模式(Flyweight)
  5. Spring MVC学习笔记02
  6. zip压缩包密码破解
  7. HOOK windows消息 C# 代码
  8. 关于在WIN32调用一些Zw系列的文件操作函数
  9. float浮动引起的ul高度崩溃与overflow的关系
  10. Linux下根据进程的名字杀死进程
  11. ACE_Time_Value
  12. 【解决】System.Web.Http.Description 缺失
  13. 《算法4》2.1 - 选择排序算法(Selection Sort), Python实现
  14. SASS笔记
  15. Batch Normalization&Dropout浅析
  16. NLP之——Word2Vec详解
  17. AlarmManager的使用和七牛云android SDK上传图片
  18. MyBatis-Plus使用教程
  19. 通过DataTable获得表的主键
  20. 记一次cocos项目的加载速度优化

热门文章

  1. QAbstractItemModel使用样例与解析(Model::index使用了createIndex,它会被销毁吗?被销毁了,因为栈对象出了括号就会被销毁)
  2. android 一个SQLite数据库多个数据表的基本使用框架 (带demo)
  3. 怎样理解JS的预解析机制
  4. HTTP协议探究(序章)
  5. 谈谈对Spring IOC的理解(转发)
  6. 钉钉微应用内置浏览器js缓存清理
  7. Django数据查询中对字段进行排序
  8. C#/.net中出现 "GDI+中发生一般性错误"解决方案
  9. 9.EL表达式 和 JSTL核心标签库
  10. 如何从零搭建hexo个人博客网站