abstract class Car{  private String name;  public abstract void drive();  public String getName() {  return name;  }  public void setName(String name) {  this.name = name;  }
}
//具体产品
class Benz extends Car{  public void drive(){  System.out.println(this.getName()+"----go-----------------------");  }
}  class Bmw extends Car{  public void drive(){  System.out.println(this.getName()+"----go-----------------------");  }
}  //简单工厂
class Driver{  public static Car createCar(String car){  Car c = null;  if("Benz".equalsIgnoreCase(car))  c = new Benz();  else if("Bmw".equalsIgnoreCase(car))  c = new Bmw();  return c;  }
}  //老板
public class BossSimplyFactory {  public static void main(String[] args) throws IOException {  //老板告诉司机我今天坐奔驰  Car car = Driver.createCar("benz");  car.setName("benz");  //司机开着奔驰出发  car.drive();
}

 

/抽象产品
abstract class Car{  private String name;  public abstract void drive();  public String getName() {  return name;  }  public void setName(String name) {  this.name = name;  }
}
//具体产品
class Benz extends Car{  public void drive(){  System.out.println(this.getName()+"----go-----------------------");  }
}
class Bmw extends Car{  public void drive(){  System.out.println(this.getName()+"----go-----------------------");  }
}  //抽象工厂
abstract class Driver{  public abstract Car createCar(String car) throws Exception;
}
//具体工厂(每个具体工厂负责一个具体产品)
class BenzDriver extends Driver{  public Car createCar(String car) throws Exception {  return new Benz();  }
}
class BmwDriver extends Driver{  public Car createCar(String car) throws Exception {  return new Bmw();  }
}  //老板
public class Boss{  public static void main(String[] args) throws Exception {  Driver d = new BenzDriver();  Car c = d.createCar("benz");   c.setName("benz");  c.drive();  }
}

先来认识下什么是产品族: 位于不同产品等级结构中,功能相关联的产品组成的家族。

 

图中的BmwCar和BenzCar就是两个产品树(产品层次结构);而如图所示的BenzSportsCar和BmwSportsCar就是一个产品族。他们都可以放到跑车家族中,因此功能有所关联。同理BmwBussinessCar和BenzBusinessCar也是一个产品族。

可以这么说,它和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。

抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。

而且使用抽象工厂模式还要满足一下条件:

1.系统中有多个产品族,而系统一次只可能消费其中一族产品

2.同属于同一个产品族的产品以其使用。

抽象工厂方法
//抽象产品(Bmw和Audi同理)
abstract class BenzCar{  private String name;  public abstract void drive();  public String getName() {  return name;  }  public void setName(String name) {  this.name = name;  }
}
//具体产品(Bmw和Audi同理)
class BenzSportCar extends BenzCar{  public void drive(){  System.out.println(this.getName()+"----BenzSportCar-----------------------");  }
}
class BenzBusinessCar extends BenzCar{  public void drive(){  System.out.println(this.getName()+"----BenzBusinessCar-----------------------");  }
}  abstract class BmwCar{  private String name;  public abstract void drive();  public String getName() {  return name;  }  public void setName(String name) {  this.name = name;  }
}
class BmwSportCar extends BmwCar{  public void drive(){  System.out.println(this.getName()+"----BmwSportCar-----------------------");  }
}
class BmwBusinessCar extends BmwCar{  public void drive(){  System.out.println(this.getName()+"----BmwBusinessCar-----------------------");  }
}  abstract class AudiCar{  private String name;  public abstract void drive();  public String getName() {  return name;  }  public void setName(String name) {  this.name = name;  }
}
class AudiSportCar extends AudiCar{  public void drive(){  System.out.println(this.getName()+"----AudiSportCar-----------------------");  }
}
class AudiBusinessCar extends AudiCar{  public void drive(){  System.out.println(this.getName()+"----AudiBusinessCar-----------------------");  }
}  //抽象工厂
abstract class Driver3{  public abstract BenzCar createBenzCar(String car) throws Exception;  public abstract BmwCar createBmwCar(String car) throws Exception;  public abstract AudiCar createAudiCar(String car) throws Exception;
}
//具体工厂
class SportDriver extends Driver3{  public BenzCar createBenzCar(String car) throws Exception {  return new BenzSportCar();  }  public BmwCar createBmwCar(String car) throws Exception {  return new BmwSportCar();  }  public AudiCar createAudiCar(String car) throws Exception {  return new AudiSportCar();  }
}
class BusinessDriver extends Driver3{  public BenzCar createBenzCar(String car) throws Exception {  return new BenzBusinessCar();  }  public BmwCar createBmwCar(String car) throws Exception {  return new BmwBusinessCar();  }  public AudiCar createAudiCar(String car) throws Exception {  return new AudiBusinessCar();  }
}  //老板
public class BossAbstractFactory {  public static void main(String[] args) throws Exception {  Driver3 d = new BusinessDriver();  AudiCar car = d.createAudiCar("");  car.drive();  }
}

优点

简单工厂模式:

1、工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。实现了对责任的分割。

2、根据外界给定的信息,决定创建哪个具体类的对象。可以从直接创建具体产品对象的尴尬局面中摆脱出来。

3、外界与具体类隔离开来,偶合性低。明确区分了各自的职责和权力,有利于整个软件体系结构的优化。

 

工厂方法模式:

1、每个具体工厂类只完成单一任务,代码简洁。

2、工厂方法模式完全满足OCP,即它有非常良好的扩展性。                    

 

抽象工厂模式:

1、分离了具体的类,帮助你控制一个应用创建的对象的类,封装创建产品对象的责任和过程。将客户和类的实现分离,通过抽象接口操纵实例。

2、产品的类名在具体工厂的实现中被分离,它们不出现在客户代码中。它使得易于交换产品系列。

3、一个具体工厂类在一个应用中仅出现一次——即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。只需改变具体的工厂即可使用不同的产品配置。它有利于产品的一致性。

4、抽象工厂模式团队的分工,降低了模块间的耦合性,提高了团队开发效率。

缺点

简单工厂模式:

1、一旦增加产品或者删除产品,整个系统都要受到影响。系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂,违背了"开放--封闭"原则(OCP).

2、简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。

       

工厂方法模式:

1、某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。

2、当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦。

抽象工厂模式:

1、抽象工厂模式在于难于应付“新对象”的需求变动。难以支持新种类的产品。

难以扩展抽象工厂以生产新种类的产品。

2、抽象工厂几乎确定了可以被创建的产品集合,支持新种类的产品就需要扩展该工厂接口

适用范围

简单工厂模式:

工厂类负责创建的对象比较少,客户只知道传入了工厂类的参数,对于始何创建对象(逻辑)不关心。

工厂方法模式:

当一个类不知道它所必须创建对象的类或一个类希望由子类来指定它所创建的对象时,当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候,可以使用工厂方法,支持多扩展少修改的OCP原则。

抽象工厂模式:

一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。这个系统有多于一个的产品族,而系统只消费其中某一产品族。同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。

总结

其实,无论是简单工厂模式、工厂方法模式还是抽象工厂模式,它们本质上都是将不变的部分提取出来,将可变的部分留作接口,以达到最大程度上的复用。究竟用哪种设计模式更适合,这要根据具体的业务需求来决定。

思维导图

码个蛋专属活动:打卡入口

为什么要做这个活动?

帮你养成好习惯(第四弹)


关注「码个蛋」,一起打卡成长

关注后可获得码仔专属表情包

5分钟教会我的程序员女友,什么是工厂模式相关推荐

  1. OSChina 周五乱弹 ——作为程序员女友是什么感受

    2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2017)请戳(这里) [今日歌曲] @元气少女 :分享古巨基的单曲<何必打扰 (电视剧<好想谈恋 ...

  2. 某一个物种能够在 1 分钟之内干掉资深程序员...网友称:恐怖如斯!

    程序员这个物种绝对都是些饱含热情,高智商,并且具有广阔胸怀的人 你看他们虽然很苦逼却可以毫无压力自嘲, 程序员的段子可谓是笑话界中的一朵奇葩之花, 这些笑话不仅可以让程序员在枯燥的生活中自娱自乐, 更 ...

  3. OSChina 周日乱弹 ——程序员女友爆照!404

    2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2017)请戳(这里) [今日歌曲] @2amor :分享Maroon 5的MV<Sugar>: ...

  4. 如果你喜欢上了一个程序员小伙,献给所有的程序员女友

    原文链接: http://blog.csdn.net/xiaole0313/article/details/47727741 如果你喜欢上了一个程序员小伙,献给所有的程序员女友 -- 由 吧主 分享 ...

  5. 停车30分钟内不收费,程序员远程操控挪车,实现自动免费停车...

    还记得前几天关于野生钢铁侠如何创造 自动驾驶自行车 的故事吗? 掌握核心科技的程序员们,又开始开脑洞啦!最近又有一个北京的开发者开了 这个脑洞的背景: 北京道路停车的自动收费,停车不足30分钟不计费 ...

  6. 如果你喜欢上了一个程序员小伙 献给所有程序员女友(来自ITeye博客的文章 作者:talent2012)...

    程序员向来是善于幽默自嘲的群体,但从某种程度上影响了咱程序员在广大女同胞心中的印象啊-- 于是写下此篇(有从别处看到的3句加进来的), 就算是为咱程序员做个广告--要是觉得有点过的程序员们,就把此文当 ...

  7. 程序员女友在京东被领导“潜规则”,竟然不回绝:表明非单身会影响绩效

    在职场中"潜规则"这个词不知从什么时候开始出现在人们的脑海中,为了能博得一席之位,能涨薪,能上位,除了富二代,有钱有势,不然"潜规则"则是最捷径的方法.而一般被 ...

  8. 如果你喜欢上了一个程序员小伙-献给所有的程序员女友

    原文地址:http://blog.renren.com/blog/315493459/787728435 程序员向来是善于幽默自嘲的群体,但从某种程度上影响了咱程序员在广大女同胞心中的印象啊-- 于是 ...

  9. 某阿里程序员女友吐槽男友整天消失不见!早上发消息凌晨才回复!

    当大厂程序员的女朋友是什么体验?都说程序员钱多空少,没时间陪女朋友,如果是老夫老妻还好,如果处于热恋期的话,那恐怕就比较痛苦了. 一个小姐姐发帖抱怨自己的阿里男朋友:一天基本就微信聊两句,早晨发个问候 ...

最新文章

  1. Android开发之Dialog的三种列表显示(解读谷歌官方API)
  2. PADS Layout VX.2.3 制作PCB封装(Decal)时,导入DXF文件
  3. contenttype添加field
  4. HNOI2010——弹飞绵羊(lct)
  5. 有没有比python更简单的语言排名_5月语言排行榜:R跌出前二十 Python紧咬C++
  6. 数学习题:求解不定方程a^2 + b^2 = 3025
  7. Tomcat软连接访问配置(symbol link)
  8. PIP scrapydo时报错ERROR: Command errored out with exit status 1: python setup.py egg_info Check the log
  9. 深入浅出Hyper-V网络虚拟化(序)
  10. 【FFMPEG】使用ffmpeg类库打开流媒体
  11. 微信小程序登录 php后台
  12. matlab金融时间序列分析,5 个 MATLAB 金融时序预测速查表
  13. C语言使用 gzip 算法压缩数据
  14. 51ditu:地图基础知识
  15. 《黑客秘笈——渗透测试实用指南(第2版)》—第2章2.3节外部或内部主动式信息搜集...
  16. 删除Docbar中的添加内容功能
  17. 信息系统成本与质量管理
  18. 电子商务网站开发流程[转]
  19. 程序员的数学思维修炼
  20. linux防火墙 33001端口,Linux防火墙基础试题-firewalld

热门文章

  1. 运维数字化转型:用数字化思维重塑运维体系
  2. 一篇吃透mysql(个人笔记)
  3. Modo教程合集44部
  4. 【C语言】模拟实现atoi函数
  5. 临时设置emacs prelude里tab的大小
  6. 信息系统运维资质与ITSS运维标准浅析
  7. 2014年iTunes Connect放假安排及开发者注意事项
  8. 升级谷歌浏览器到90版本后导致设置set-cookie失败,登录接口成功但还是401问题
  9. 详解Facebook手机
  10. 【批处理DOS-CMD命令-汇总和小结】-CMD窗口的设置与操作命令(cd、title、mode、color、pause、chcp、exit、goto :eof)