目录

背景

需求

分析

代码

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.具体业务类且只需要实现自己的业务,其他的一概不需要关心。业务类扩展性好,且不用修改工厂类,或者增加工厂。- 满足

工厂模式的缺点及解决到生产的应用相关推荐

  1. JavaScript --- [学习笔记]观察者模式 理解对象 工厂模式 构造函数模式

    说明 本系列(JS基础梳理)为后面TCP的模拟实现做准备 本篇的主要内容: 观察者模式.工厂模式.构造函数模式 和 对对象的理解 1. 观察者模式 参考JavaScript设计模式 1.1 消息注册方 ...

  2. GOF23设计模式(创建型模式)工厂模式

    目录: 一:工厂模式的核心本质 二:关于面向对象的六大基本原则 三:工厂模式的三大类详解(代码示例,详细分析) 首先,上咱本GOF23所有工厂模式的分类表格!!! 创建型模式 单例模式.工厂模式.抽象 ...

  3. 新同事说工厂模式有啥用,别学了

    工厂模式有啥用啊,我的项目没使用工厂模式也照样运行 这是我听过最令人哭笑不得的吐槽,这个程序猿的头发不知道有没有被自己薅秃 的确,项目中不使用工厂模式并不会影响项目的运行 但是,当项目后期需要二次开发 ...

  4. 021 设计模式之工厂方法模式,抽象工厂模式的区别

    简单工厂模式,工厂方法模式和抽象工厂模式的异同 简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类.我们掌握一种思想,就是在创建一个对象时,需要把容易发 ...

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

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

  6. 三大工厂模式的优缺点

    简单工厂模式,工厂方法模式和抽象工厂模式都是属于创建型设计模式,这三种创建型模式都不需要知道具体类.我们掌握一种思想,就是在创建一个对象时,需要把容易发生变化的地方给封装起来,来控制变化(哪里变化,封 ...

  7. 设计模式之工厂模式(Factory)(3)

    在面向对象编程中,最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下,new操作符直接生成对象会带来一些问题.举例来说,许多类型对象的创造需要一系列的 ...

  8. 干货分享:什么是Java设计工厂模式?

    本文主要会介绍三种工厂模式:简单工厂,工厂方法,抽象工厂.其中简单工厂并不属于 GoF 23 种设计模式,工厂方法和抽象工厂模式则是属于 GoF 23 种设计模式之中的 2 种.工厂模式作为一种非常常 ...

  9. 【Java设计模式】工厂模式

    分工越细,项目就更容易拓展 工厂模式实现了创建者和调用者分离. 设计模式是一种思想,学习设计模式可以提高你的思考角度. 面向对象设计的基本原则: OCP(开闭原则,Open-Closed Princi ...

最新文章

  1. 数组名和数组名取地址的区别
  2. 面试两个星期来的一点体会
  3. taro 重新加载小程序_Taro 小程序采坑
  4. mysql 查询表结构 几种方法
  5. 如果你也想做实时数仓…
  6. 江西财经计算机应用杨教授,江西财经大学信息管理学院研究生导师介绍:刘德喜...
  7. React(74)--onRef在react中的使用
  8. 第一个mybatis项目(IDEA+MAVEN+Junit)
  9. 提取MapInfo地图数据中的空间数据解决方案
  10. 查看java堆栈信息
  11. paranoid用法
  12. 数据库:Redis数据库
  13. 像计算机科学家一样思考在线,如何像计算机科学家一样思考?(女生篇)
  14. Pytorch优化器Optimizer
  15. 微信小程序api记载
  16. 粘贴应变片步骤及注意事项
  17. 1080p60Hz需要传多少数据,怎么计算显示器带宽(一)【华光昱能知识与您分享】
  18. 深大和南科大计算机,南方科技大学和深圳大学,到底哪一所的性价比高呢
  19. MD5 SHA1 HMAC HMAC_SHA1区别(转载网上大牛)个人备忘和加注了
  20. 【MATLAB】布朗运动动画仿真

热门文章

  1. ant design pro入门踩坑:删除页面文件报错
  2. JPEG图像压缩详解
  3. 如何买到便宜的云服务器?
  4. Mac下代码中文乱码问题解决方法
  5. java判断字符串长度_java判断中文字符串长度的简单实例
  6. 【Vue知识点- No7.】路由、vant组件库的使用
  7. AppID、AppKey、AppSecret
  8. 电脑移动硬盘清理不出垃圾怎么办
  9. 下载安装Java运行环境
  10. 7-20 表达式转换(中缀转后缀)