还记得之前的工厂方法模式么?现在老板更加富有了,除了水果,还准备搞点其他的生意,再做点服装生意。水果工厂和服装工厂明显就不是同一种东西,肯定不能放到一个工厂里面生产,服装也有好几种,但是不同的工厂,也是老板自己的,老板希望能够把握大局,所以不同工厂,肯定是有同一个特征的,也就是他们都是工厂,并且都是老板的。

先来创建一个接口Fruit.java

public interface Fruit {public void print();
}

创建水果的实体类Apple.java:

public class Apple implements Fruit{@Overridepublic void print() {System.out.println("苹果产品生产出来了");}
}

Pear.java:

public class Pear implements Fruit{@Overridepublic void print() {System.out.println("雪梨产品生产出来了");}
}

除了水果产品,我们还有服装产品,因此先创建一个Clothes.java:

public interface Clothes {public void process();
}

服装厂有哪些产品呢?先生产两种Jeans.java:

public class Jeans implements Clothes{@Overridepublic void process() {System.out.println("牛仔裤生产出来了");}
}

Dresses.java:

public class Dresses implements Clothes{@Overridepublic void process() {System.out.println("连衣裙生产出来了");}
}

既然也要生产水果产品,也要生产服装产品,那就先搞个抽闲工厂AbstractFactory.java,有两个方法,一个生产水果产品,一个生产服装产品:

public abstract class AbstractFactory {// 生产水果public abstract Fruit getFruit(String name);// 生产衣服public abstract Clothes getClothes(String name);
}

上面只是工厂的大致模型,但是每一种工厂都有自己的特点,所以水果工厂FruitFactory.java要自己实现生产水果产品的过程:

public class FruitFactory extends AbstractFactory{@Overridepublic Fruit getFruit(String name) {if(name==null){return null;}if("Apple".equalsIgnoreCase(name)){return new Apple();}else if("Pear".equalsIgnoreCase(name)){return new Pear();}return null;}@Overridepublic Clothes getClothes(String name) {return null;}
}

同样,衣服工厂ClothesFactory.java也要自己实现工厂的具体生产过程:

public class ClothesFactory extends AbstractFactory {@Overridepublic Fruit getFruit(String name) {return null;}@Overridepublic Clothes getClothes(String name) {if (name == null) {return null;}if ("Jeans".equalsIgnoreCase(name)) {return new Jeans();} else if ("Dresses".equalsIgnoreCase(name)) {return new Dresses();}return null;}
}

不同的工厂怎么管理呢?需要一个工厂创造器FactoryProducer.java,把不同的工厂造出来,也可以理解成为工厂的工厂:

public class FactoryProducer {public static AbstractFactory getFactory(String type) {if (type == null) {return null;}if ("Fruit".equalsIgnoreCase(type)) {return new FruitFactory();} else if ("Clothes".equalsIgnoreCase(type)) {return new ClothesFactory();}return null;}
}

测试代码FactoryTest.java:

public class FactoryTest {public static void main(String[] args) {AbstractFactory fruitFactory = FactoryProducer.getFactory("Fruit");Fruit apple = fruitFactory.getFruit("apple");apple.print();Fruit pear = fruitFactory.getFruit("pear");pear.print();AbstractFactory clothesFactory = FactoryProducer.getFactory("Clothes");Clothes jeans = clothesFactory.getClothes("jeans");jeans.process();Clothes dresses = clothesFactory.getClothes("Dresses");dresses.process();}
}

测试结果如下:

苹果产品生产出来了
雪梨产品生产出来了
牛仔裤生产出来了
连衣裙生产出来了

抽象工厂模式,本质上也是工厂模式,也是属于创建型模式,用于创建对象。其特点是用一个超级工厂创建其他的工厂,也就是工厂的工厂。每一个工厂管理一类的产品,比如水果工厂主要负责生产水果产品,服装工厂服装生产服装产品。而每一种工厂本质上都是工厂,都从抽象工厂中衍生出来,只是做了不同的实现。

  • 优点:如果需要增加其他的工厂,容易拓展,增加工厂中的产品,也可以拓展。不需要关心创建的细节,相同的类型产品放置在一起创建。
  • 缺点:增加了抽象的复杂度,理解难度增加。

【作者简介】
秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。个人写作方向:Java源码解析,JDBC,Mybatis,Spring,redis,分布式,剑指Offer,LeetCode等,认真写好每一篇文章,不喜欢标题党,不喜欢花里胡哨,大多写系列文章,不能保证我写的都完全正确,但是我保证所写的均经过实践或者查找资料。遗漏或者错误之处,还望指正。

2020年我写了什么?

开源编程笔记

平日时间宝贵,只能使用晚上以及周末时间学习写作,关注我,我们一起成长吧~

设计模式【2.2】-- 工厂模式怎么演变成抽象工厂模式?相关推荐

  1. 设计模式【2.1】-- 简单工厂模式怎么演变成工厂方法模式?

    还记得前面的简单工厂模式么?我们开了一个水果工厂FruitFactory,生产三种水果Apple,Pear,Orange.今天给大家讲讲工厂方法模式: 老板搞水果工厂赚了点小钱,准备扩大生产,每个工厂 ...

  2. Java设计模式-工厂模式(3)抽象工厂模式

    在Java设计模式-工厂模式(2)工厂方法模式 我们知道了工厂方法模式解决了简单工厂模式中的缺陷,做到了满足开闭原则,但是时代是进步的,进而又产生新的问题,工厂难道只能生产一种东西吗.我们所见到的工厂 ...

  3. 每天学习一个设计模式(八):创建型之抽象工厂模式

    目录 一.基本概念 二.通俗解释 三.应用场景 1.使用简单工厂模式的解决方案 2.抽象工厂模式 抽象工厂模式结构 在什么情况下应当使用抽象工厂模式 抽象工厂模式的起源 四.抽象工厂模式的优缺点 抽象 ...

  4. 工厂模式三部曲之三_抽象工厂模式(附三部曲源码)

    抽象工厂模式是对工厂模式的进一步抽象,是工厂模式中最为抽象和最具一般性的一种形态,提供了创建一系列相关或者相互依赖对象的接口,而无需指定他们的类型. 如果你对工厂模式还有些迷惑的,可以回顾下工厂模式的 ...

  5. 虚拟机的安装和linux操作系统(RedHat.8.5)的安装。将虚拟机的网络连接模式分别调换成仅主机模式,nat模式,桥接模式并获取ip地址使用ssh通过不同用户远程连接。在linux系统下破解密码

    目录 一.在VMware上如何创建虚拟机以及安装linux操作系统. 二.修改主机名为server.local. 三.将虚拟机的网络连接模式分别调换成仅主机模式,nat模式,桥接模式并获取ip地址使用 ...

  6. 设计模式总结四(外观模式、建造者模式、观察者模式和抽象工厂模式)

    序 这么多天里,我已经读完了<大话设计模式>.放寒假了,没有了通过学业考试的重担,阅读技术书籍的时间页多出来了不少. 在今天我刚阅读了<kafka权威指南>的第一章,关于介绍k ...

  7. 【设计模式】11-15:迪米特拉(最小知识)原则、外观模式、建造者模式、观察者模式、抽象工厂模式...

    十一.迪米特拉原则/最小知识原则 如果两个类直接进行通信,那么这两个类就不能存在关系 调用其他类的方法时,需要第三个类实现转发-->外观类 尽量降低类的访问权限 十二.外观模式 隐藏系统的复杂性 ...

  8. 教程2,工厂方法实现发奖,抽象工厂实现redis集群,JDK动态代理应用

    简单 工厂方法 抽象 区别 三个工厂的区别 简单:提供方法的工厂.并不算设计模式, 我要A对象 ,你给我A对象 ,B对象也是这里要.拿哪一个你帮我选. 产品工厂--> 产品接口(if else) ...

  9. 虚拟机(VMware Workstation)中,把连接网络的模式由“NAT模式”,改成“自动桥接模式”,网速大大的提升...

    安装虚拟机,默认情况下,联网的模式是NAT,即跟主机是转发共用网络资源的,这样就非常慢,时常网页都打不开,现把它改成桥接模式,让它独立成为一台物理机,网速有大大的改善,设置操作如下: VM --> ...

最新文章

  1. iOS 13 如何删除SceneDelegate
  2. linux怎么停止ssh服务,Linux 故障排除:关闭 SSH 会话后如何保存工作状态?
  3. R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵)、使用rotate参数指定进行斜交旋转提取因子、使用nfactors参数指定抽取的因子个数、fa函数因子分析结果解读
  4. centos7离线安装tengine所需依赖
  5. 编程范式,程序员的编程世界观(转)
  6. HDU 1281 棋盘游戏 【二分图最大匹配】
  7. 深入浅出node.js游戏服务器开发1——基础架构与框架介绍
  8. 韩顺平 linux视频教程
  9. 3D打印行业入行总结
  10. LeetCode 246/247/248 中心对称数
  11. Javaweb(二)制作调查问卷
  12. 常见蛋白质种类_蛋白粉有哪些种类?都有什么作用?常见的6种蛋白粉
  13. nvidia-nccl
  14. 12个乒乓球称重问题
  15. 云计算实验4 面向行业背景的大数据分析与处理综合实验
  16. Vue.js + axios 实现excel下载
  17. DH2F200N6S-ASEMI快恢复模块200A 600V
  18. 输入三角形三边边长,求三角形的面积
  19. 十岁孩子幽门螺旋杆菌会不会影响发育?最好的治疗方法是这样的
  20. iPhone手机信号不好怎么办?原来简单设置一下,信号就能轻松满格

热门文章

  1. android拍照保存照片方向,android 拍照的照片方向问题,读取图片EXIF信息
  2. 帝国cms系统7.5 文档word
  3. 面向对象程序设计(JAVA)复习笔记(下)
  4. 十个经典的Android开源项目
  5. getImageMatrix、getMatrix傻傻分不清
  6. luogu P4100 [HEOI2013]钙铁锌硒维生素
  7. 仿真软件 JaamSim介绍
  8. 网络系统集成实习——第一天——2017.9.6
  9. python读取excel多个sheet页并合并成一页
  10. 网易2018校园招聘编程题真题集合