一个工厂的故事续集

随着行业的激烈竞争,低端电视机已经淘汰,存活下来的高端电视机品牌就那么2家了,分别是:华为、荣耀。而工厂已经垄断了所有品牌的电视机的生产,为了使工厂继续保持营业额的增长,这个时候,工厂的高层开了一个重要会议。最终定下了一个战略目标:决定在生产电视机的同时,将营业范围扩大为笔记本电脑、手机行业。

为了实现这个目标,厂长又找到了工程师小曾,让他提供设计方案。

小曾眉头深锁,一时间没有想到合适的方案,于是开始梳理现有的情况,目前总共有几家工厂:华为工厂、荣耀工厂,分别生产华为智慧屏、荣耀智慧屏。

经营范围包含:电视机、笔记本电脑、手机。这个很长一段时间是不会改变的,那么可以这样:
电视机标准:

public interface TV {public void play();
}

具体电视机:

/*** 华为电视机* @author zherop*/
public class HuaweiTV implements TV {public void play() {System.out.println("华为电视机播放...");}
}/*** 荣耀电视机* @author zherop*/
public class HonorSmartTV implements TV {public void play() {System.out.println("ҫǻ...");}
}

笔记本电脑标准:

public interface PC {public void surfInternet();
}

具体笔记本电脑:

/*** 华为笔记本* @author zherop*/
public class HuaweiPC implements PC {public void surfInternet() {System.out.println("华为笔记本上网...");}}/*** 荣耀笔记本* @author zherop*/
public class HonorPC implements PC {public void surfInternet() {System.out.println("荣耀笔记本上网...");}}

手机标准:

public interface SmartPhone {public void call();
}

具体手机:

/*** 华为智能机* @author zherop*/
public class HuaweiSmartPhone implements SmartPhone {public void call() {System.out.println("华为智能机拨打电话...");}}/*** 荣耀智能机* @author zherop*/
public class HonorSmartPhone implements SmartPhone {public void call() {System.out.println("荣耀智能手机拨打电话...");}}

工厂标准:

/*** 工厂规范* @author zherop*/
public interface Factory {/*** 生产电视机* * @return*/public TV createTV();/*** 生产笔记本电脑* @return*/public PC createPC();/*** 生产智能手机* @return*/public SmartPhone createSmartPhone();
}

具体工厂:

/*** 华为工厂* @author zherop*/
public class HuaweiFactory implements Factory {public TV createTV() {return new HuaweiTV();}public PC createPC() {return new HuaweiPC();}public SmartPhone createSmartPhone() {return new HuaweiSmartPhone();}}/*** 荣耀工厂* @author zherop*/
public class HonorFactory implements Factory {public TV createTV() {return new HonorSmartTV();}public PC createPC() {return new HonorPC();}public SmartPhone createSmartPhone() {return new HonorSmartPhone();}}

场景代码:

public class Client {public static void main(String[] args) {// 使用华为工厂,生产华为全系产品Factory factory = new HuaweiFactory();TV tv = factory.createTV();tv.play();PC pc = factory.createPC();pc.surfInternet();SmartPhone smartPhone = factory.createSmartPhone();smartPhone.call();}
}

如果后续,有其他新的品牌崛起,那么现在的设计还是可以完美支持,只需要新增该品牌的工厂来生产该品牌的电视机、笔记本电脑、手机即可。

然后,小曾将此套设计交给了厂长去实施。果然好使!

好几年过去了,小米品牌强势崛起,在经营范围下,厂长想生产小米的产品。于是又找到了小曾。小曾明白需求后,便说:“厂长莫慌,此事皆在掌控之中”。然后直接给出了应对之策。

新增小米品牌工厂:

/*** @author zherop*/
public class XiaomiFactory implements Factory {public TV createTV() {return new XiaomiTV();}public PC createPC() {return new XiaomiPC();}public SmartPhone createSmartPhone() {return new XiaomiSmartPhone();}}

新增小米电视机、笔记本、手机:

/*** 小米电视机* @author zherop*/
public class XiaomiTV implements TV {public void play() {System.out.println("小米电视机播放...");}}/*** 小米笔记本* @author zherop*/
public class XiaomiPC implements PC {public void surfInternet() {System.out.println("小米笔记本上网...");}}/*** 小米智能机* @author zherop*/
public class XiaomiSmartPhone implements SmartPhone{public void call() {System.out.println("小米智能机拨打电话...");}}

场景类:

public class Client {public static void main(String[] args) {//      Factory factory = new HuaweiFactory();// 切换为小米工厂,生产小米全系产品Factory factory = new XiaomiFactory();TV tv = factory.createTV();tv.play();PC pc = factory.createPC();pc.surfInternet();SmartPhone smartPhone = factory.createSmartPhone();smartPhone.call();}
}

好了,至此故事完结,故事中就使用了抽象工厂模式,接下来,我们来看看抽象工厂模式。

定义

抽象工厂模式定义:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
涉及的两个概念:
(1)产品等级结构
产品的继承结构。比如故事中的TV、HuaweiTV、HonorSmartTV、XiaomiTV就是一个产品等级结构,总共有3个产品等级结构:TV、PC、SmartPhone。
(2)产品族
由同一个工厂生产的,位于不同产品等级结构中的一组产品。比如故事中的HuaweiFactory生产的HuaweiTV、HuaweiPC、HuaweiSmartPhone就是一个产品族,总共有3个产品族:Huawei产品族、Honor产品族、Xiaomi产品族。
示意图:

涉及的角色:

  1. 抽象工厂(AbstractFactory)
    用于声明创建抽象产品的方法,往往是定义一组方法。比如故事中的Factory接口,就定义了生成TV、PC、SmartPhone方法。
  2. 具体工厂(ConcreteFactory)
    实现抽象工厂声明的方法,生成一组具体产品,这些产品构成一个产品族。比如故事中的HuaweiFactory、HonorFactory、XiaomiFactory。
  3. 抽象产品(AbstractProduct)
    为每种产品声明接口,在抽象产品种定义了抽象业务方法。可以是接口或者抽象类。比如故事中的TV、PC、SmartPhone。
  4. 具体产品(ConcreteProduct)
    实现了抽象产品所定义的业务方法。比如故事中的HuaweiTV、HuaweiPC、HuaweiSmartPhone。
    类图:

适用场景

  1. 场景类不需要关心具体产品创建的细节,将对象的创建与使用解耦;
  2. 存在多个产品族,并且每次只会使用其中一个产品族;
  3. 属于同一个产品族的产品会一起被使用。
    比较典型的场景有:创建在不同操作系统的图形环境下都可以运行的系统。

扩展

  1. 可以很方便地增加产品族,符合“开闭原则”。此外增加产品等级结构,需要修改所有工厂类,不符合“开闭原则”。
  2. 如果只存在一个产品等级结构,抽象工厂模式就退化为工厂方法模式。

抽象工厂模式:一个工厂的故事续集相关推荐

  1. 设计模式之工厂类模式总结对比、简单工厂模式、工厂方法模式、抽象工厂模式、带反射的工厂模式、例子代码分析、最详细

    1. 题目 假设某公司同时用SqlServer.MySql数据库,即会切换两数据库(不同数据库的sql语句有些许差异),同时,两数据库里均有对Users.Departments表的操作(sql代码不一 ...

  2. 抽象工厂模式-与-工厂方法模式区别

    转自:http://blog.csdn.net/wangwenhui11/article/details/3955125 --------------------------------- 对于jav ...

  3. 抽象工厂模式java_面试官:说一下静态工厂模式,工厂方法模式,抽象工厂的区别吧...

    静态工厂模式 用生活中的场景类比一下这三种模式,假如你想学习Java视频,你得自己到处去找资料,找资料是一个繁琐的过程,过一段时间你又想学Python视频了,你还得去找资料.现在你在学校上学,你想学J ...

  4. 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂)

    园子里关于23种设计模式的博文已经可以说是成千上万.车载斗量.屯街塞巷.不计其数.数不胜数.摩肩接踵.汗牛充栋.车水马龙.门庭若市.琳琅满目直至让人眼花缭乱了.在这样的大环境下之所以来写设计模式类的博 ...

  5. 创建型模式:工厂模式(简单工厂+工厂方法+抽象工厂)

    一.引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!& ...

  6. 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂) v阅读目录

    1楼留头头大神:http://www.cnblogs.com/toutou/p/4899388.html v阅读目录 v写在前面 v简单工厂模式 v工厂方法模式 v抽象工厂模式 v博客总结 v博客前言 ...

  7. 工厂模式,简单工厂模式,抽象工厂模式三者有什么区别

    工厂模式,也叫做说虚构造器,在简单工厂中间插入了一个具体产品工厂,这个工厂知道产品构造时候的具体细节,而简单工厂模式的产品具体构造细节是在一个个if/else分支,或者在switch/case分支里面 ...

  8. 23种设计模式之简单工厂模式,工厂方法模式,抽象工厂模式详解

    工厂模式详解 1. 简单工厂模式 1.1 需求分析 1.2 使用传统方式实现 1.2.1 类图 1.2.2 代码实现 1.2.2.1 新建pizza抽象类 1.2.2.2 希腊披萨实现类 1.2.2. ...

  9. 工厂模式——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...

    工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Factory):不利于产生系列产品: 2)工厂方法模式(Factory Method):又称为多形性工厂: 3) ...

  10. 设计模式之工厂模式(工厂方法模式 和 抽象工厂模式)

    工厂模式的概念 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式. 工厂模式包括工厂方法模式和抽象工厂模式.抽象工厂模式是工厂方法模式的扩展. 工厂方法模式的实现步骤如下: ...

最新文章

  1. “IIS配置401错误”完美解决方案
  2. 解决“SSL handshake failed“问题
  3. Python网络爬虫与信息提取(三)(正则表达式的基础语法)
  4. Postman全局变量的使用
  5. Eclipse中部分快捷键
  6. win10家庭版删除文件提示没有权限最简单的方式
  7. 北大程序设计实习MOOC 编程作业 《魔兽世界之二:装备》
  8. 选择标签至文本域效果,可多选/可过滤重复/可限制个数
  9. 交付量强劲增长 特斯拉营收却将出现7年来首次下滑
  10. JS箭头函数的优势在哪里
  11. Mysql函数和存储过程
  12. wsarecv: An existing connection was forcibly closed by the remote host.
  13. Postgres-XL集群的搭建和测试详解
  14. 小菊的语义分割3——数据预处理及像素级分类实现原理
  15. 二战暨南大学网络空间安全经验贴,纯干货!
  16. 枪战html源码,Unity3D 激情热血的枪战游戏 完整源码 Intense TPS v1.2
  17. (坑)DTOJ#5045. 战争
  18. 【实验】Oracle 10g RAC生产数据库RMAN方式恢复到异地单机数据库全程记录
  19. 又一款好看的中文字体,可免费商用
  20. Andriod Studio

热门文章

  1. 科猫网:农村最稀缺的行业是什么?怎么创业?
  2. RFID助力银行实现数字化服务升级(二)
  3. 百度智能云联合发布《雄安新区2022年大数据研究报告》
  4. 打靶识别(Opencv For Unity惊现bug)
  5. 用遗传算法求解多旅行推销员问题的新方法
  6. JavaScript到底如何存储数据?
  7. 结构化查询语言(SQL)简介
  8. 使用 text_io 输出成 excel 格式的突破性发现(SLK)
  9. 2021年中国病毒性肝炎发病人数、死亡人数及预防措施分析[图]
  10. bmp 格式转 yuv420p 格式