工厂模式的缺点及解决到生产的应用
目录
背景
需求
分析
代码
1.工厂类
2.业务类
3.客户端
总结
背景
工厂模式实际开发中用到很多,网上的介绍案例非常多。工厂模式存在一些问题:
使用工厂前:我们有一系列的产品类,都有共同的父类。这种情况才会想到工厂。
简单工厂
定义:专门定义一个类来负责创建产品对象(根据唯一标识分发)
优点:简单
缺点:耦合度高,如果有变动就需要修改唯一的工厂的入口方法。
工厂方法
定义:专门定义一个用于创建产品对象接口,子工厂类去决定,实例化具体产品类。每个产品都有自己的工厂。
本质:就是把简单工厂的方法抽象了,具体产品都要去实现各自的工厂。解决简单工厂缺点。这样服务端新增产品,不需要改代码。只需新增,产品,和其对应的工厂。
优点:符合开闭原则(具体的业务类有具体工厂),
缺点:每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量。但是实际开发中,客户端也不会去主动找工厂的啊,这就好比你买手机,你买苹果手机去苹果官网买,买华为去华为商城买。我再想买小米,又要搞一个小米的商城,才能买手机。这确实是扩展性好。实际中我们是通过一个入口去买更方便,这才是用户比较迫切的需求,就比如,我在京东,输入苹果,就买买到苹果,输入华为就能买到华为了。所以工厂方法我觉得存在的问题复杂了,回归本初,回到最初简单工厂思想:通过一个唯一入口,根据不同的参数,即可获得具体的业务类。
需求
实现一个网关,路由不同的渠道。考虑扩展,符合开闭原则,工厂模式是不二选择。怎么才能写好符合开闭的工厂模式呢?
开闭原则:就是说对扩展开放,对修改关闭。
分析
我们要设计的网关,来路由不同的业务类,要满足的条件:
1.开闭原则必须满足;
2.工厂类提供唯一入口分发;避免新增业务增加新的工厂代码量
3.具体业务类且只需要实现自己的业务,其他的一概不需要关心。业务类扩展性好,且不用修改工厂类,或者增加工厂。
代码
使用的开发环境:springboot、jdk1.8
抽象一个造手机的工厂业务
1.工厂类
public class JdMallFactory {private static Map<String, Phone> map = new HashMap<>();public static Phone getPhoneService(String phoneName){return map.get(phoneName);}public static void addPhoneService(String phoneName, Phone phone) {map.put(phoneName, phone);}
}
2.业务类
1)枚举:业务名唯一标示
public enum PhoneNameEnum {apple,huawei,xiaomi
}
2)接口:定义业务功能
public interface Phone {void call();
}
3)抽象类:具体业务和工厂合作抽象模版化,后续业务类不需要关心,继承此类即可
public abstract class AbstractPhone implements Phone {public AbstractPhone() {providePhoneToFactory();}abstract String getPhoneName();@PostConstructpublic void providePhoneToFactory() {JdMallFactory.addPhoneService(getPhoneName(), this);}
}
4)业务扩展类,华为手机
public class HuaWeiService extends AbstractPhone {@Overridepublic String getPhoneName() {return PhoneNameEnum.huawei.name();}@Overridepublic void call() {System.out.println(getPhoneName() + "增加定制功能");System.out.println("使用" + getPhoneName() + "打电话");}
}
5)业务扩展类,苹果手机
public class AppleService extends AbstractPhone {@Overridepublic String getPhoneName() {return PhoneNameEnum.apple.name();}@Overridepublic void call() {System.out.println(getPhoneName() + "增加定制功能");System.out.println("使用" + getPhoneName() + "打电话");}
}
3.客户端
public class FactoryTest {@Testpublic void testFactory() {// 1、模拟服务端启动,华为和苹果公司成立。(使用Spring框架,这一步使用组件注入到IOC即可,不用new)new HuaWeiService();new AppleService();// 2、模拟客户端:用户买手机(京东商城买手机)Phone phoneService = JdMallFactory.getPhoneService(PhoneNameEnum.huawei.name());// 用户使用手机phoneService.call();phoneService = JdMallFactory.getPhoneService(PhoneNameEnum.apple.name());phoneService.call();}}
测试输出:
huawei增加定制功能
使用huawei打电话
apple增加定制功能
使用apple打电话
总结
以上代码实现,可以看出是满足我们想法的:
1.开闭原则必须满足;- 满足
2.工厂类提供唯一入口分发;避免新增业务增加新的工厂代码量。- 满足
3.具体业务类且只需要实现自己的业务,其他的一概不需要关心。业务类扩展性好,且不用修改工厂类,或者增加工厂。- 满足
工厂模式的缺点及解决到生产的应用相关推荐
- JavaScript --- [学习笔记]观察者模式 理解对象 工厂模式 构造函数模式
说明 本系列(JS基础梳理)为后面TCP的模拟实现做准备 本篇的主要内容: 观察者模式.工厂模式.构造函数模式 和 对对象的理解 1. 观察者模式 参考JavaScript设计模式 1.1 消息注册方 ...
- GOF23设计模式(创建型模式)工厂模式
目录: 一:工厂模式的核心本质 二:关于面向对象的六大基本原则 三:工厂模式的三大类详解(代码示例,详细分析) 首先,上咱本GOF23所有工厂模式的分类表格!!! 创建型模式 单例模式.工厂模式.抽象 ...
- 新同事说工厂模式有啥用,别学了
工厂模式有啥用啊,我的项目没使用工厂模式也照样运行 这是我听过最令人哭笑不得的吐槽,这个程序猿的头发不知道有没有被自己薅秃 的确,项目中不使用工厂模式并不会影响项目的运行 但是,当项目后期需要二次开发 ...
- 021 设计模式之工厂方法模式,抽象工厂模式的区别
简单工厂模式,工厂方法模式和抽象工厂模式的异同 简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类.我们掌握一种思想,就是在创建一个对象时,需要把容易发 ...
- 详解设计模式之工厂模式(简单工厂+工厂方法+抽象工厂)
园子里关于23种设计模式的博文已经可以说是成千上万.车载斗量.屯街塞巷.不计其数.数不胜数.摩肩接踵.汗牛充栋.车水马龙.门庭若市.琳琅满目直至让人眼花缭乱了.在这样的大环境下之所以来写设计模式类的博 ...
- 三大工厂模式的优缺点
简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类.我们掌握一种思想,就是在创建一个对象时,需要把容易发生变化的地方给封装起来,来控制变化(哪里变化,封 ...
- 设计模式之工厂模式(Factory)(3)
在面向对象编程中,最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下,new操作符直接生成对象会带来一些问题.举例来说,许多类型对象的创造需要一系列的 ...
- 干货分享:什么是Java设计工厂模式?
本文主要会介绍三种工厂模式:简单工厂,工厂方法,抽象工厂.其中简单工厂并不属于 GoF 23 种设计模式,工厂方法和抽象工厂模式则是属于 GoF 23 种设计模式之中的 2 种.工厂模式作为一种非常常 ...
- 【Java设计模式】工厂模式
分工越细,项目就更容易拓展 工厂模式实现了创建者和调用者分离. 设计模式是一种思想,学习设计模式可以提高你的思考角度. 面向对象设计的基本原则: OCP(开闭原则,Open-Closed Princi ...
最新文章
- 数组名和数组名取地址的区别
- 面试两个星期来的一点体会
- taro 重新加载小程序_Taro 小程序采坑
- mysql 查询表结构 几种方法
- 如果你也想做实时数仓…
- 江西财经计算机应用杨教授,江西财经大学信息管理学院研究生导师介绍:刘德喜...
- React(74)--onRef在react中的使用
- 第一个mybatis项目(IDEA+MAVEN+Junit)
- 提取MapInfo地图数据中的空间数据解决方案
- 查看java堆栈信息
- paranoid用法
- 数据库:Redis数据库
- 像计算机科学家一样思考在线,如何像计算机科学家一样思考?(女生篇)
- Pytorch优化器Optimizer
- 微信小程序api记载
- 粘贴应变片步骤及注意事项
- 1080p60Hz需要传多少数据,怎么计算显示器带宽(一)【华光昱能知识与您分享】
- 深大和南科大计算机,南方科技大学和深圳大学,到底哪一所的性价比高呢
- MD5 SHA1 HMAC HMAC_SHA1区别(转载网上大牛)个人备忘和加注了
- 【MATLAB】布朗运动动画仿真