摘要:所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。
0x01.定义与类型
定义:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口
无需指定它们具体的类
类型:创建型
UML
基本java实现
/** * 工厂接口 */ public interface IFactory { AProduct1 createProduct1(); AProduct2 createProduct2(); } /** * 产品1 */ public abstract class AProduct1 { public abstract void produce(); } /** * 产品2 */ public abstract class AProduct2 { public abstract void produce(); } /** * 工厂实现 */ public class FactoryImpl implements IFactory { @Override public ProductImpl1 createProduct1() { return new ProductImpl1(); } @Override public ProductImpl2 createProduct2() { return new ProductImpl2(); } } /** * 产品1实现 */ public class ProductImpl1 extends AProduct1 { @Override public void produce() { System.out.println("产品1"); } } /** * 产品2实现 */ public class ProductImpl2 extends AProduct2 { @Override public void produce() { System.out.println("产品2"); } } /** * 测试与应用 */ public class Test { public static void main(String[] args) { FactoryImpl factory = new FactoryImpl(); ProductImpl1 productImpl1 = factory.createProduct1(); ProductImpl2 productImpl2 = factory.createProduct2(); productImpl1.produce(); productImpl2.produce(); } }
输出结果
产品1 产品2
抽象工厂中的元素
工厂接口:在抽象工厂模式中,工厂接口定义了同一类型的工厂可以生产多种不同的产品,定义了产品的种类。当工厂生成的种类发生变化时,要调整接口中的方法,这里违反了开闭原则,但是扩展不同类型的工厂,只需要实现接口就可以了。
工厂实现类:定义了具体的工厂以及具体生成的类型,有多少中类型的工厂,就有多少个具体的实现类。
具体产品的抽象类:一个工厂有可能生产出不同的产品,抽象类定义工厂生产产品的种类,抽象工厂接口中有多少个方法,就有多少个抽象类。
具体产品的实现:最后得到的具体产品,决定了产品在客户端中的具体行为。
0x02.适用场景客户端(应用层)不依赖于产品类实例如何被创建,实现等细节
强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码
提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现
0x03.优点具体产品在应用层代码隔离,无需关心创建细节
将一个系列的产品族统一到一起创建
在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。
0x04.缺点规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口
增加了系统的抽象性和理解难度
0x05.产品等级结构与产品族介绍
以家用电器为例:
美的:空调,热水器,冰箱,洗衣机
海尔:空调,热水器,冰箱,洗衣机
美的的全部产品属于一个产品族
美的的热水器和海尔的热水器属于一个产品等级
美的和海尔属于不同的工厂
空调,热水器,冰箱,洗衣机属于同一工厂生产的不同产品
0x06.样例实现简介:慕课网的每一门课程都有手记和视频等,课程又分Java课程,Python课程
课程工厂类
//课程工厂 public interface ICourseFactory { Video getVideo(); Article getArticle(); }
文章/视频抽象类
//文章抽象类 public abstract class Article { public abstract void produce(); } //视频抽象类 public abstract class Video { public abstract void produce(); }
Java课程的实现
//Java课程工厂 public class JavaCourseFactory implements ICourseFactory { @Override public JavaVideo getVideo() { return new JavaVideo(); } @Override public JavaArticle getArticle() { return new JavaArticle(); } } //Java视频 public class JavaVideo extends Video { @Override public void produce() { System.out.println("录制JAVA课程视频"); } } //Java文章 public class JavaArticle extends Article { @Override public void produce() { System.out.println("编写Java课程手记"); } }
Python课程实现
//Python课程工厂 public class PythonCourseFactory implements ICourseFactory { @Override public Video getVideo() { return new PythonVideo(); } @Override public Article getArticle() { return new PythonArticle(); } } //Python视频实现 public class PythonVideo extends Video { @Override public void produce() { System.out.println("录制Python视频"); } } //Python文章 public class PythonArticle extends Article { @Override public void produce() { System.out.println("编写Python课程手记"); } }
测试与应用类
public class Test { public static void main(String[] args) { //java 产品族 ICourseFactory courseFactory = new JavaCourseFactory(); Video video = courseFactory.getVideo(); Article article = courseFactory.getArticle(); video.produce(); article.produce(); } }
输出结果
录制JAVA课程视频 编写Java课程手记
样例UML类图
0x07.源码中的抽象工厂
java.sql.Connection
Statement
PreparedStatement
java.sql.Statement
executorSet
MyBatis: SqlSessionFactory
0x08.源码地址抽象工厂模式: https://github.com/sigmako/design-pattern/tree/master/abstract-factory
0x09.参考慕课网设计模式精讲: https://coding.imooc.com/class/270.html
23种设计模式(3):抽象工厂模式: https://blog.csdn.net/zhengzhb/article/details/7359385
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/74846.html
摘要:参考文章深入理解三种工厂模式工厂模式,工厂方法模式,抽象工厂模式详解工厂模式是中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 参考文章:深入理解java三种工厂模式工厂模式,工厂方法模式,抽象工厂模式 详解 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的...
摘要:但本质是,简单工厂并未严格遵循设计模式的开闭原则,当需要增加新产品时也需要修改工厂代码。但是工厂方法则严格遵守开闭原则,模式只负责抽象工厂接口,具体工厂交给客户去扩展。 最近开展了三次设计模式的公开课,现在来总结一下设计模式在PHP中的应用,这是第二篇创建型模式之工厂模式。 设计模式的一般介绍在第一篇文章讲了,这里就不重复。 工厂模式 实现:定义一个用于创建对象的接口,让子类决定实...
摘要:主要详解简单工厂模式到抽象工厂模式的演变。抽象工厂模式当一个类别的产品还有多个系列区分时,为了按系列生产商品,使用抽象工厂区分。 主要详解简单工厂模式到抽象工厂模式的演变。 简单工厂模式 即静态工厂模式1.将对象的创建和使用分开;2.将生产过程集中,便于集中管理;3.当需要创建的对象类有变动时,就不用在所有new 的地方修改了,直接修改工厂类即可; /** * 简单工厂模式 ---...
阅读 2477·2023-04-26 00:42
阅读 2783·2021-09-24 10:34
阅读 3786·2021-09-24 09:48
阅读 4123·2021-09-03 10:28
阅读 2548·2019-08-30 15:56
阅读 2754·2019-08-30 15:55
阅读 3215·2019-08-29 12:46
阅读 2212·2019-08-28 17:52