工厂模式,优缺点以及存在的意义

  • 1.简单工厂模式(静态工厂模式)
  • 2.工厂方法模式
  • 工厂模式的本质

    实例化对象不使用new,用工厂方法代替
    将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现解耦

- oop七大原则
开闭原则:一个软件的实体应当对扩展开放,对修改关闭
依赖倒转原则:要针对接口编程,不要针对实现编程
迪米特法则:只与你直接的朋友通信,而避免和陌生人通信

  • 应用场景
    JDK中Calendar的getInstance方法
    JDBC中的Connection对象的获取
    Spring中IOC容器创建管理bean对象
    反射中Class对象newInstance方法

  • 优点

    简单工厂模式:工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。通过它,外界可以从直接创建具体产品对象的尴尬局面中摆脱出来。外界与具体类隔离开来,偶合性低。明确区分了各自的职责和权力,有利于整个软件体系结构的优化。

    工厂方法模式:工厂方法模式是为了克服简单工厂模式的缺点(主要是为了满足OCP)而设计出来的。简单工厂模式的工厂类随着产品类的增加需要增加很多方法(或代码),而工厂方法模式每个具体工厂类只完成单一任务,代码简洁。工厂方法模式完全满足OCP,即它有非常良好的扩展性。

  • 缺点

    简单工厂模式:当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦增加产品或者删除产品,整个系统都要受到影响。系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂,违背了"开放–封闭"原则(OCP).另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。

    工厂方法模式:假如某个具体产品类需要进行一定的修改,很可能需要修改对应的工厂类。当同时需要修改多个产品类的时候,对工厂类的修改会变得相当麻烦。比如说,每增加一个产品,相应的也要增加一个子工厂,会加大了额外的开发量。

1.简单工厂模式(静态工厂模式)

用来生产同一等级结构的任意产品,对于增加产品,需要球盖已有代码
例如我们模仿一个车工厂,先创建车模型
 public interface Car{void name();}
然后创建实现类WuLing,模仿五菱宏光
 public class WuLing implements Car{@Overridepublic void name(){System.out.println("五菱宏光")}}
创建实现类Tesla,模仿特斯拉
 public class Tesla implements Car{@Overridepublic void name(){System.out.println("特斯拉")}}
创建消费者,模仿买车
 public class Consumer{public static void main(String[] args){Car wuLing = new WuLing();Car tesla = new Tesla();wuLing.name();tesla.name();}}

以上为原来的方法,实现买车,需要了解接口,所有的实现类,工厂模式本质为:实例化对象不使用new,我们买车,不需要知道车是怎么造的,不需要造车,我们创建工厂类

 public class CarFactory{public static Car getCar(String car){if(car.equals("五菱")){return new WuLing();}else if(car.equals("特斯拉")){return new Tesla();}else {return null;}}}

这是我们的消费者买车为

 public class Consumer{public static void main(String[] args){//Car wuLing = new WuLing();//Car tesla = new Tesla();//使用工厂创建,我们把new交给工厂/**加入造车需要很多零件,我们来造车,需要很多零件,但交给工厂我们不需要这些细节*/Car wuLing =CarFactory.getCar("五菱");Car tesla=CarFactory.getCar("特斯拉");wuLing.name();tesla.name();}}

上方就是简单工厂模式,但是不难发现简单工厂模式的弊端如果我们新增车的类型,造不同类型的车,需要改变工厂类的代码,而我们想要实现的是新增一种车型不需要改变原来的类

2.工厂方法模式

用来生产同一等级结构的固定产品,支持增加任意产品
模仿车模型
 public interface Car{void name();}
模仿特斯拉
 public class Tesla implements Car{@Overridepublic void name(){System.out.println("特斯拉")}}
模仿五菱
 public class WuLing implements Car{@Overridepublic void name(){System.out.println("五菱宏光")}}

工厂方法模式,创建车工厂

public interface CarFactory{Car getCar();
}

创建特斯拉车工厂,造特斯拉

public class TeslaFactory implements CarFactory{@Overridepublic Car getCar(){return new Tesla();}
}

创建五菱车工厂,造五菱

public class WuLingFactory implements CarFactory{@Overridepublic Car getCar(){return new WuLing();}
}
模仿消费者
 public class Consumer{public static void main(String[] args){Car wuLing = new WuLingFactory().getCar();Car tesla = new TeslaFactory().getCar();wuLing.name();tesla.name();}}

这种情况我们再次新增一种车型,我们不需要改变原来的类,只需要新增一个车工厂,实现了解耦操作,满足开闭原则
但是这种模式如果有非常多的车,车又有很多的零件(零件接口)这种模式就满足不了我们的需求

工厂模式(简单工厂模式、工厂方法模式优缺点,使用场景)相关推荐

  1. php 工厂模式运用实例,php工厂模式的实例

    * 单例模式:用于创建单一类型的唯一实例对象 * 工厂模式:用于创建多种类型的多个实例对象 //声明形状类 class Shape { //声明静态方法create,根据容器形状不同,创建不同图形类的 ...

  2. 详解设计模式:模版方法模式

    模板方法模式(Template Method Pattern)也被称为模板模式(Template Pattern),是在 GoF 23 种设计模式中定义了的行为型模式. 模板方法模式 定义一个操作中的 ...

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

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

  4. 简单工厂模式、工厂方法模式、抽象工厂模式 之间的对比

    先看各自的结构: 简单工厂模式(SimpleFactory Mode): 简单工厂模式的思路是,首先我们把一些共性的东西(算法)拿出来,进行抽象,比如加减乘除.然后我们在定义一个类作为工厂类,工厂类的 ...

  5. 4、简单工厂模式,工厂方法模式,

    1.工厂模式定义                                             简单工厂模式:用一个单独的类来做这个创造实力的过程,这就是工厂. 工厂方法模式:定义一个用于创 ...

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

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

  7. 简单工厂模式与工厂方法模式

    在OO设计领域,我们知道前人总结了不少的经验,许多的经验在现代软件工程过程中已经被认为是原则来遵守.下面笔者摘抄几项下文涉及到的OO原则的定义. OCP(开闭原则,Open-Closed Princi ...

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

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

  9. 工厂方法模式和简单工厂模式的区别

    简单工厂模式 就我们的计算器例子来说,简单工厂模式的思想就是,创建一个运算类,创建一个简单工厂类. 运算类派生加法类.减法类.乘法类...... 简单工厂类主要是根据传入的符号字符串,做相应的条件判断 ...

  10. 最简单java设计模式:工厂方法模式

    前言 在前一篇文章讲解了一下简单工厂模式,在上篇文章中,我们也讲到了简单工厂模式的缺点,就是不满足开闭原则,这对于软件的设计来说,是不太好的,而下面讲解的工厂方法模式,正是为了弥补简单工厂模式的缺点, ...

最新文章

  1. Ubuntu中设置防火墙的开启与关闭
  2. Spring源码阅读(六)
  3. SAP Commerce Cloud Spartacus UI 读取 Component 元数据的 Action 设计
  4. 多图技术贴:深入浅出解析大数据平台架构
  5. python复制文件到指定文件夹_python 拷贝文件夹下所有的文件到指定文件夹(不包括目录)...
  6. 矩池云上如何修改cudnn版本
  7. Flex动态创建多个曲线图+柱形图
  8. 让应用通过苹果审核出人头地的10个方法
  9. Lagrangian乘子法 对偶问题 KKT条件 Slater条件 与凸优化
  10. Python深度学习路线
  11. PostgreSQL安装及关联ArcMap
  12. 房屋出租系统(java)
  13. 程序员的五种不同寻常的特质
  14. Linux系统如何查看内存
  15. 华为手机里的“麦田守望者”
  16. Laya1.x Timer小记
  17. 经典力学(动力学)——牛顿定律
  18. 研究黑苹果系统——拯救者Y7000P-10875H
  19. 利用计算机证明猜想,计算机科学家利用量子纠缠系统,证实44年前的一个猜想是错误的...
  20. Mock工具wiremock-py

热门文章

  1. 简单的控制台梭哈游戏
  2. 使用docker网络相关命令
  3. 我相信每个人都有选择自己生活方式的权利 —— 写在美术专栏前面
  4. 【洛谷 P3674】 小清新人渣的本愿(bitset,莫队)
  5. bazel 链接_如何使用bazel build
  6. 小米笔记本 去掉登录密码(Win10系统)
  7. 数据结构 串 KMP 模式匹配详解 通俗易懂
  8. 【ChatGPT】科技革命促生互联网时代 ChatGPT浪潮打乱时代布局 人工智能新时代下的发展前景
  9. android notifydatasetchanged 刷新错误,错误:无法解析notifyDataSetChanged(); Android的
  10. 葛洲坝电力集团责任有限公司走起新的轨迹星辰