【java设计模式】-03抽象工厂模式
抽象工厂 简述
抽象工厂模式(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());
}
}
优点
抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。另外,应用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛的应用。
当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。这对一些需要根据当前环境来决定其行为的软件系统来说,是一种非常实用的设计模式。
增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
缺点
在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。
适用场景
一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
系统中有多于一个的产品族,而每次只使用其中某一产品族。
属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
最新文章
- 【转】WPF 给DataGridTextColumn统一加上ToolTip
- 移动设备如何打开RMS加密的文档
- Newtonsoft.Json动态过滤属性
- 设计模式:享元模式(Flyweight)
- Spring MVC学习笔记02
- zip压缩包密码破解
- HOOK windows消息 C# 代码
- 关于在WIN32调用一些Zw系列的文件操作函数
- float浮动引起的ul高度崩溃与overflow的关系
- Linux下根据进程的名字杀死进程
- ACE_Time_Value
- 【解决】System.Web.Http.Description 缺失
- 《算法4》2.1 - 选择排序算法(Selection Sort), Python实现
- SASS笔记
- Batch Normalization&;Dropout浅析
- NLP之——Word2Vec详解
- AlarmManager的使用和七牛云android SDK上传图片
- MyBatis-Plus使用教程
- 通过DataTable获得表的主键
- 记一次cocos项目的加载速度优化
热门文章
- QAbstractItemModel使用样例与解析(Model::index使用了createIndex,它会被销毁吗?被销毁了,因为栈对象出了括号就会被销毁)
- android 一个SQLite数据库多个数据表的基本使用框架 (带demo)
- 怎样理解JS的预解析机制
- HTTP协议探究(序章)
- 谈谈对Spring IOC的理解(转发)
- 钉钉微应用内置浏览器js缓存清理
- Django数据查询中对字段进行排序
- C#/.net中出现 ";GDI+中发生一般性错误";解决方案
- 9.EL表达式 和 JSTL核心标签库
- 如何从零搭建hexo个人博客网站