工厂模式(简单工厂模式、工厂方法模式优缺点,使用场景)
工厂模式,优缺点以及存在的意义
- 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();}}
这种情况我们再次新增一种车型,我们不需要改变原来的类,只需要新增一个车工厂,实现了解耦操作,满足开闭原则
但是这种模式如果有非常多的车,车又有很多的零件(零件接口)这种模式就满足不了我们的需求
工厂模式(简单工厂模式、工厂方法模式优缺点,使用场景)相关推荐
- php 工厂模式运用实例,php工厂模式的实例
* 单例模式:用于创建单一类型的唯一实例对象 * 工厂模式:用于创建多种类型的多个实例对象 //声明形状类 class Shape { //声明静态方法create,根据容器形状不同,创建不同图形类的 ...
- 详解设计模式:模版方法模式
模板方法模式(Template Method Pattern)也被称为模板模式(Template Pattern),是在 GoF 23 种设计模式中定义了的行为型模式. 模板方法模式 定义一个操作中的 ...
- 设计模式之工厂类模式总结对比、简单工厂模式、工厂方法模式、抽象工厂模式、带反射的工厂模式、例子代码分析、最详细
1. 题目 假设某公司同时用SqlServer.MySql数据库,即会切换两数据库(不同数据库的sql语句有些许差异),同时,两数据库里均有对Users.Departments表的操作(sql代码不一 ...
- 简单工厂模式、工厂方法模式、抽象工厂模式 之间的对比
先看各自的结构: 简单工厂模式(SimpleFactory Mode): 简单工厂模式的思路是,首先我们把一些共性的东西(算法)拿出来,进行抽象,比如加减乘除.然后我们在定义一个类作为工厂类,工厂类的 ...
- 4、简单工厂模式,工厂方法模式,
1.工厂模式定义 简单工厂模式:用一个单独的类来做这个创造实力的过程,这就是工厂. 工厂方法模式:定义一个用于创 ...
- 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂)
园子里关于23种设计模式的博文已经可以说是成千上万.车载斗量.屯街塞巷.不计其数.数不胜数.摩肩接踵.汗牛充栋.车水马龙.门庭若市.琳琅满目直至让人眼花缭乱了.在这样的大环境下之所以来写设计模式类的博 ...
- 简单工厂模式与工厂方法模式
在OO设计领域,我们知道前人总结了不少的经验,许多的经验在现代软件工程过程中已经被认为是原则来遵守.下面笔者摘抄几项下文涉及到的OO原则的定义. OCP(开闭原则,Open-Closed Princi ...
- 创建型模式:工厂模式(简单工厂+工厂方法+抽象工厂)
一.引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!& ...
- 工厂方法模式和简单工厂模式的区别
简单工厂模式 就我们的计算器例子来说,简单工厂模式的思想就是,创建一个运算类,创建一个简单工厂类. 运算类派生加法类.减法类.乘法类...... 简单工厂类主要是根据传入的符号字符串,做相应的条件判断 ...
- 最简单java设计模式:工厂方法模式
前言 在前一篇文章讲解了一下简单工厂模式,在上篇文章中,我们也讲到了简单工厂模式的缺点,就是不满足开闭原则,这对于软件的设计来说,是不太好的,而下面讲解的工厂方法模式,正是为了弥补简单工厂模式的缺点, ...
最新文章
- Ubuntu中设置防火墙的开启与关闭
- Spring源码阅读(六)
- SAP Commerce Cloud Spartacus UI 读取 Component 元数据的 Action 设计
- 多图技术贴:深入浅出解析大数据平台架构
- python复制文件到指定文件夹_python 拷贝文件夹下所有的文件到指定文件夹(不包括目录)...
- 矩池云上如何修改cudnn版本
- Flex动态创建多个曲线图+柱形图
- 让应用通过苹果审核出人头地的10个方法
- Lagrangian乘子法 对偶问题 KKT条件 Slater条件 与凸优化
- Python深度学习路线
- PostgreSQL安装及关联ArcMap
- 房屋出租系统(java)
- 程序员的五种不同寻常的特质
- Linux系统如何查看内存
- 华为手机里的“麦田守望者”
- Laya1.x Timer小记
- 经典力学(动力学)——牛顿定律
- 研究黑苹果系统——拯救者Y7000P-10875H
- 利用计算机证明猜想,计算机科学家利用量子纠缠系统,证实44年前的一个猜想是错误的...
- Mock工具wiremock-py
热门文章
- 简单的控制台梭哈游戏
- 使用docker网络相关命令
- 我相信每个人都有选择自己生活方式的权利 —— 写在美术专栏前面
- 【洛谷 P3674】 小清新人渣的本愿(bitset,莫队)
- bazel 链接_如何使用bazel build
- 小米笔记本 去掉登录密码(Win10系统)
- 数据结构 串 KMP 模式匹配详解 通俗易懂
- 【ChatGPT】科技革命促生互联网时代 ChatGPT浪潮打乱时代布局 人工智能新时代下的发展前景
- android notifydatasetchanged 刷新错误,错误:无法解析notifyDataSetChanged(); Android的
- 葛洲坝电力集团责任有限公司走起新的轨迹星辰