工厂模式

  • 前言
  • 一、简单工厂模式
  • 二、工厂方法模式
    • 优点:
    • 缺点:
  • 三、工厂方法模式适合应用场景
  • 总结

前言

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

工厂模式分为三种: 简单工厂模式、工厂方法模式、抽象工厂模式


一、简单工厂模式

用来生产同一等级结构中的任意产品(对于增加新的产品,需要修改已有代码)

业务实例:客户买车(客户自己不去new车(不用关心车怎么实现的细节),而是通过工厂生产车,减少硬编码)

1、Car.class

public interface Car{void name();
}

2、BaoMa.class

public class BaoMa implements Car{@Overridepublic void name() {System.out.println("宝马");}
}

3、BenChi.class

public class BenChi implements Car{@Overridepublic void name() {System.out.println("奔驰");}
}

4、Customer.class

未使用工厂模式的情况下,我们自己去new要购买的车,不符合我们的工厂模式设计思想:

public class Customer {public static void main(String[] args) {Car car1 = new BaoMa();Car car2 = new BenChi();car1.name();car2.name();}
}


5、CarFactory.class 创建工程类,让他帮我们实现new车操作

/*** @description: 静态(简单)工厂模式* @author: ydf* @date: 2021/3/6 20:13* @version: v1.0*/
public class CarFactory {public static Car getCar(String car){if(car.equals("奔驰")) {return new BenChi();}else if(car.equals("宝马")) {return new BaoMa();}else {return null;}}
}

调用工程类、直接购买我们想要的车。

public class Customer {public static void main(String[] args) {Car car1 = CarFactory.getCar("宝马");Car car2 = CarFactory.getCar("奔驰");car1.name();car2.name();}
}

总结:此时当我们想要一个大众车的时候,我们也需要创建一个实现类,去实现Car,此时我们的工厂类(CarFactory )需要修改getCar方法代码了,违反了开闭原则,我们应该扩展,不应该修改。

二、工厂方法模式

工厂方法模式,每个车都有自己的工厂,横向扩展,实现了开闭原则。

public interface CarFactory {Car getCar();
}
public class BaoMaFactory implements CarFactory{@Overridepublic Car getCar() {return new BaoMa();}
}
public class BenChiFactory implements CarFactory{@Overridepublic Car getCar() {return new BenChi();}
}

优点:

1、下次加入大众车,只需要新建一个 DazhongFactory(大众的工厂) 就行,不会影响到别的工厂。

2、你可以避免创建者和具体产品之间的紧密耦合。

3、单一职责原则。 你可以将产品创建代码放在程序的单一位置, 从而使得代码更容易维护。

4、开闭原则。 无需更改现有客户端代码, 你就可以在程序中引入新的产品类型。

缺点:

代码量加大,管理复杂,结构复杂,实际业务一般使用简单工厂模式。

三、工厂方法模式适合应用场景

  1. 当你在编写代码的过程中, 如果无法预知对象确切类别及其依赖关系时, 可使用工厂方法。
  2. 如果你希望用户能扩展你软件库或框架的内部组件, 可使用工厂方法。
  3. 如果你希望复用现有对象来节省系统资源, 而不是每次都重新创建对象, 可使用工厂方法。

列入一些我们经常使用的工厂方法:使用Spring的IOC进行Bean管理,所谓(IOC)控制反转是指应用程序本身不负责所需对象的创建和维护,而是由外部容器完成,应用程序直接拿来使用。

依赖注入(Dependency Injection)是Spring实现IOC的一种方式,即在容器运行期间,动态地将依赖关系注入到对象。例如对象a的内部需要一个对象b,这时不需要我们手动new一个,而是由IOC容器动态地将依赖对象b注入到a内。

总结

不一定要符合设计原则,要根据实际情况加以分析取舍。

Java23种设计模式之工厂模式相关推荐

  1. iOS 21种设计模式之工厂模式

    原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc?viewmode=list 我的stackoverflow 感谢 感谢<Pro Objective-C ...

  2. 23种设计模式之工厂模式学习笔记

    什么是工厂模式? 工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式.该模式用于封装和管理对象的创建,是一种创 ...

  3. 23种设计模式-抽象工厂模式《三国王者》

    对于许久不用的东西,容易忘记.百度许久,也未能找到自己所要. 从今日起,有些东西就记载下来,不仅方便自己,希望能帮到他人吧! 定义: 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体 ...

  4. 23种设计模式——抽象工厂模式

    目录 抽象工厂模式(AbstractFactory) 产品族 理解 UML图 优缺点 应用场景 抽象工厂模式VS和工厂模式 实例 数据访问(工厂方法) 数据访问(抽象工厂) 用简单工厂改造抽象工厂 C ...

  5. 23种设计模式-抽象工厂模式介绍加实战代码

    1.描述 通俗一点来讲,抽象工厂模式就是在工厂方法模式的抽象工厂类中规范多个同类产品. 工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法模式是一个产品系列一个工厂,而抽 ...

  6. JAVA23种设计模式之生成器模式

    生成器模式 生成器模式是一种对象的创建模式,可以将一个复杂产品的内部表象和产品的生产过程分隔开来,(构建与表示分离).使得同样的构建过程可以创建不同的表示. 简单的来说,就是讲一个复杂的对象拆分成一个 ...

  7. Java--23种设计模式之decorator模式

    装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性.动态给一个对象增加功能,这些功能可以再动态的撤消.增加由一些基本功能的排列组合而产生的非常大量的 ...

  8. Java23种设计模式之-----访问者模式

    一.什么是访问者模式? Visitor模式也叫做访问者模式,是行为模式之一,它分离对象的数据和行为,使用Visitor模式,可以不修改已有类的情况下,增加新的操作. 二.访问者模式的应用实例 比如有一 ...

  9. java23种设计模式之五:代理模式

    一.代理模式介绍 代理模式的定义:就是为一个接品(对象)提供一个代理的对象,并由这个代理对象控制对原对象的访问流程 其中代理又分为:静态代理和动态代理 静态代理:指的是自己要写一个代理类,或者用工具生 ...

最新文章

  1. 4个最难的 Elastic Search 面试题
  2. JustOj 1486: Hello, world!
  3. vue cli 4.x打包后如何部署到tomcat服务器上
  4. 分享百度文库提交成功的八大因素
  5. (计算机组成原理)第二章数据的表示和运算-第二节8:数据的存储和排列
  6. Python简记--函数
  7. 3、数据库的事务、并发和锁机制
  8. 除法求模中求逆元的两种方法
  9. C++:使用vector::reserve来避免不必要的重新分配
  10. PCB Layout 设计流程
  11. Python教你实现微信防撤回~
  12. Threejs中使用A*算法寻路导航,Threejs室内室外地图导航
  13. java面试 系统调优_面试官:Java性能调优你会多少?一个问题就把我问的哑口无言,哭了!...
  14. MySQL游标无法获取数据-1329 - No data - zero rows fetched, selected, or processed
  15. pdf太大了怎么缩小?怎么能缩小pdf文件大小?
  16. C语音数组数据从小到大排序
  17. 微信小程序routeDone错误问题
  18. 【笔记】申请域名(免费)、创建ssl证书(自签、免费)、自动续签
  19. java身体指数计算判定BMI
  20. 人工智能神经网络有哪些研究的领域,详细说明

热门文章

  1. java 对象引用 弱引用吗_Java对象的强引用、软引用、弱引用和虚引用 笔记
  2. OpenJudge NOI 1.2 04:填空:类型转换1
  3. 信息学奥赛一本通(1050:骑车与走路)
  4. 相似基因(洛谷-P1140)
  5. 人口增长(信息学奥赛一本通-T1070)
  6. 23 SD配置-主数据-定义销售地区
  7. 苹果cms模板_苹果cms是什么东西?
  8. Windows高精度微秒级(并发)定时器实现
  9. noip2014到2017初赛提高组看程序写结果、完善程序
  10. C++:explicit关键字