背景:
话说改革开放的时候,互联网未普及的时候,中国境内的手机都是去华强北进货,然后分散到中国各地商场,随着科技的发张,后来发展成各个专卖店,最后发展成各个流水线生产手机。这一系列的变化特别像我们工厂模式的进阶,下面带你一起来探讨工厂模式之
简单工厂,工厂方法,抽象工厂设计

简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
工厂方法 :用来生产同一等级结构中的固定产度品。(支持增加任意产品)
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新内的产品,无能为力;支持容增加产品族)

简单工厂模式

  • 工厂类角色:

简单工厂模式的核心,含有一定的商业逻辑和判断逻辑,根据逻辑不同,产生具体的工厂产品。如例子中的PhoneFactory(华强北)类。

  • 抽象产品角色:

它一般是具体产品继承的父类或者实现的接口。由接口或者抽象类来实现。如例中的Phone接口。

  • 具体产品角色

:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现,如例子中的OppO,Apple类。
来用类图来清晰的表示下的它们之间的关系:

/*** @author evanYang* @version 1.0* @date 2020/4/25 下午 1:58*/
public interface Phone {void feature();
}public class OppOPhone implements Phone {@Overridepublic void feature() {System.out.println("外观漂亮,拍照美美哒,深受女性喜爱,配置差劲,光有虚表");}}public class ApplePhone implements Phone {@Overridepublic void feature() {System.out.println("值得卖肾的手机,带有洗脑功能");}
}public class PhoneFactory {public static Phone getCar(String name){Phone phone=null;if(name.equals("OppO")){phone=new OppOPhone();}else if(name.equals("Apple")){phone=new ApplePhone();}return  phone;}public static void main(String[] args) {//跑到华强北,根据你的需求 给你配置啥手机,比如说你需要的是OppO手机 ,毕竟你不卖肾Phone oppO = getCar("OppO");oppO.feature();}
}

随着科技的发展,我们发现有了越来越多的手机1+,Vivo,华为,小米,,小小的商场已经放不小了,要继续新增,就需要进行商店的停业整顿扩容,这对于想一直赚钱的商家来说,这是非常难以接受的。我们发现简单工厂模式要新增这些产品是非常痛苦的。

工厂方法模式

  1. 抽象工厂角色:

这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

  1. 具体工厂角色:

它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。

  1. 抽象产品角色:

它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。

  1. 具体产品角色:

具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
来用类图来清晰的表示下的它们之间的关系:

分析
相比于简单工厂模式,我们发现工厂方法增加了抽象工厂的具体实现,就好比一开始是再大商场里面卖各种各样的手机,现在都有了自己的专卖店,苹果专卖店只卖苹果手机,Vivo手机专卖店只卖Vivo手机。代码如下:

/*** @author evanYang* @version 1.0* @date 2020/4/25 下午 1:58*/
public interface Phone {void feature();
}public class OppOPhone implements Phone {@Overridepublic void feature() {System.out.println("外观漂亮,拍照美美哒,深受女性喜爱,配置差劲,光有虚表");}}public class ApplePhone implements Phone {@Overridepublic void feature() {System.out.println("值得卖肾的手机,带有洗脑功能");}
}public interface Store {Phone createPhone();
}```java
public class AppleStore implements Store {@Overridepublic Phone createPhone() {return new ApplePhone();}
}public class OppOStore implements Store {@Overridepublic Phone createPhone() {return new ApplePhone();}
}public static void main(String[] args) {//深南大道新开了一家AppleStore  打折Store store = new AppleStore();//小白赶紧去买了一个苹果手机Phone phone = store.createPhone();//买来很开心 赶紧在朋友圈晒晒phone.feature();}

当有新的手机产生时,只要按照抽象产品角色,抽象工厂角色提供的合同来生成,那么就可以供客户使用,而不必去修改任何已有的代码(即当有新产品时,只要创建并基础抽象产品;新建具体工厂继承抽象工厂;而不用修改任何一个类)工厂方法模式是完全符合开闭原则的!

使用工厂方法模式足以应付我们可能遇到的大部分业务需求。但是当产品种类非常多时,就会出现大量的与之对应的工厂类,这不应该是我们所希望的。所以我建议在这种情况下使用简单工厂模式与工厂方法模式相结合的方式来减少工厂类:即对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实现。
当然特殊的情况,就要特殊对待了:对于系统中存在不同的产品树,而且产品树上存在产品族(下一节将解释这个名词)。那么这种情况下就可能可以使用抽象工厂模式了。

小结:

让我们来看看简单工厂模式、工厂方法模式给我们的启迪:
如果不使用工厂模式来实现我们的例子,也许代码会减少很多——只需要实现已有的Phone,不使用多态。但是在可维护性上,可扩展性上是非常差的(你可以想象一下添加一辆手机后要牵动的类)。因此为了提高扩展性和维护性,多写些代码是值得的。

抽象工厂模式

抽象工厂模式的适用范围比工厂模式更加广泛,它与工厂模式最大的区别在于:
工厂模式中一个工厂只能生产一种产品,而抽象工厂可以生产多个。

抽象工厂对应的产品族的概念,大家都知道我们一个手机公司不可能只生产一个型号的手机,比如说苹果公司,生产的苹果手机就有很多型号4S,7S,XS等等。这其实就是一个抽象工厂的概念

/*** @author evanYang* @version 1.0* @date 2020/04/26 14:58*/
public interface Phone {void feature();
}public abstract class AppleAbstractPhone implements  Phone {@Overridepublic abstract void feature() ;
}public abstract class OppOAbstractPhone implements Phone  {@Overridepublic abstract void feature();
}public class Apple6S extends AppleAbstractPhone {@Overridepublic void feature() {System.out.println("生产苹果6S,绝对牛牛的");}
}public class AppleXS extends AppleAbstractPhone {@Overridepublic void feature() {System.out.println("10周年纪念手机,值得拥有");}
}public class OppOA8 extends OppOAbstractPhone {@Overridepublic void feature() {System.out.println("OppO A8手机 美美哒");}
}public class OppOA9 extends OppOAbstractPhone {@Overridepublic void feature() {System.out.println("oppo A9 闪充");}
}public interface Store {public Phone get2018Phone();public Phone get2019Phone();
}public class AppleStore implements Store {@Overridepublic Phone get2018Phone() {return new Apple6S();}@Overridepublic Phone get2019Phone() {return new AppleXS();}
}public class OppOStore implements Store {@Overridepublic Phone get2018Phone() {return new OppOA8();}@Overridepublic Phone get2019Phone() {return new OppOA9();}
}public class User {public static void main(String[] args) {Store store = new AppleStore();Phone phone = store.get2018Phone();Phone phone1 = store.get2019Phone();phone.feature();phone1.feature();Store oppOStore = new OppOStore();Phone oppoPhone = oppOStore.get2018Phone();Phone phone2 = oppOStore.get2019Phone();oppoPhone.feature();phone2.feature();}
}

我们都知道手机厂商基本每年都会出好几款手机,这个手机就相当于产品族的概念,我们知道手机厂商出款一个新的产品是件比较容易的事情,但是如果你要出现一个手机厂商这个在抽象模式就比较难了,就相当于要出现一个华为呀,1+呀这样的手机厂商那难度就可大了,就是这个概念。但是当手机厂商只有一个产品的时候,出现厂商就是件很容易的事情,就比如说摩拜单车刚出来那会,就出来好多小黄车,哈罗等等。

简单工厂,工厂方法,抽象工厂思想-手机时代的变迁相关推荐

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

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

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

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

  3. 简单工厂-工厂方法-抽象工厂

    目录 简单工厂 工厂方法 抽象工厂 前言 之前看书认真了解过这三种模式,但因为没有做记录,都给忘完了.现在重新分析网上的博客发现跟书里讲的不太一样,哎-.现在能做的就是把现在的理解给记录一下,若以后有 ...

  4. 简单工厂 工厂方法 抽象工厂 如何理解

    文章目录 前言 一.简单工厂 二.工厂方法 三.抽象工厂 总结 前言 简单工厂,工厂方法,抽象工厂,三者有什么区别? 搞清楚他们有什么弊端,以发展的角度去观察,理解会更加深入. 提示:以下是本篇文章正 ...

  5. java 三种工厂模式(简单工厂+工厂方法+抽象工厂)

    一.简单工厂模式 概述   简单工厂模式:定义一个工厂类,它可以根据参数的不同返回不同类的 实例,被创建的实例通常都具有共同的父类.因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因 ...

  6. 设计模式学习笔记——03 简单工厂 工厂方法 抽象工厂

    简单工厂 简单工厂模式也成静态工厂模式,但此模式不符合开闭原则,但仍然很常用 适用范围:工厂类需要创建的对象种类比较少,客户端只需要知道传入工厂类的参数,对于如何创建对象(逻辑)不关心 上段代码: p ...

  7. JAVA工厂模式优缺点_简单工厂模式、工厂模式和抽象工厂模式区别及优缺点

    各位小伙伴好,今天给大家主要介绍一下简单工厂模式.工厂模式和抽象工厂模式的区别及各自的优缺点. (本文实现语言为Python3) [前言] 众所周知今天所讲的内容是 设计模式的一类:对于设计模式这个概 ...

  8. 简单工厂模式、工厂模式和抽象工厂模式区别及优缺点

    各位小伙伴好,今天给大家主要介绍一下简单工厂模式.工厂模式和抽象工厂模式的区别及各自的优缺点. (本文实现语言为Python3) [前言] 众所周知今天所讲的内容是设计模式的一类:对于设计模式这个概念 ...

  9. 设计模式之——简单(静态)工厂模式和抽象工厂模式

    文章目录 [关于设计模式] 设计模式的诞生 设计模式概念与解读 设计模式的原则 [关于工厂模式] 简单工厂(静态工厂)模式的概念 抽象工厂模式 工厂模式的使用时机和注意事项 给自己的思考 [关于设计模 ...

  10. 最简单java设计模式:抽象工厂模式

    前言 在前一篇文章讲解了一下简单工厂模式和工厂方法模式,这篇文章再把抽象工厂模式讲解一下. 一.什么是抽象工厂模式 抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的.抽象工厂模式可以向客户端提 ...

最新文章

  1. 95后程序员业余帮人鉴定毒蘑菇,竟成百万粉丝的网络大V!
  2. cd返回上一 git_git统计代码量脚本
  3. 【渝粤教育】国家开放大学2018年春季 0300-21T图形创意 参考试题
  4. node.js Websocket消息推送---GoEasy
  5. oracle Blob保存方式,关于文件保存到Oracle中BLOB字段的方法及例子
  6. 智能合约从入门到精通:Solidity Assembly
  7. 计算机语言python发音_Python如何像scratch一样朗读文字?
  8. 东京奥运出租车超预算想找滴滴接盘被拒 网友:真当人傻吗?
  9. Nginx学习之一:从权威途径(wiki)了解Nginx
  10. Leetcode-探索 | 买股票的最佳时机II
  11. pyqt5写一个抽奖程序(再次美化)
  12. mobileu-vst声卡设置
  13. python矩阵计算器心得_NumPy入门攻略:手把手带你玩转这款强大的数据分析和计算工具...
  14. linux纯文本无法键入密码,Apple Mac OS X FileVault纯文本密码本地安全限制绕过漏洞...
  15. 华为服务器显示乱码,本地正常 服务器乱码
  16. 中国特种腈行业市场供需与战略研究报告
  17. 论文经验 - 计算机视觉(CV)方向
  18. 用session和mysql实现购物车_Session和Cookie实现购物车
  19. English Learning - Day3 作业打卡 2022.12.9 周五
  20. 关于“发现在互联网状态下的生活时间流逝很快的分析”

热门文章

  1. Windows下使用Git+rsync构建文件同步工具
  2. 淘宝宝贝排名影响因素有哪些?
  3. HTML网页设计结课作业 榆林子州 HTML5响应式旅游景区网站模板
  4. html设置了背景图片不显示,CSS设置背景图片不显示的解决方法
  5. 树莓派linux负载均衡集群,在树莓派2上Nginx并发1W到底有多难
  6. windows7时钟屏保怎么设置_w7时钟屏保怎么设置
  7. 3D建模的几种常用建模方法
  8. 非科班转码,上岸小公司我也很满意了
  9. 如何群发邮件?教你发邮件时文件怎么命名、如何设置邮件格式,一文解决你的疑惑
  10. 甲骨文裁员真的与川普有关吗?