目录

一、开闭原则(Open Close Principle):

二、简单工厂模式的实现:

三、简单工厂模式违反了开闭原则

四、建议


一、开闭原则(Open Close Principle):

  • 定义:

一个软件实体(如类、模块和函数)应该对扩展开放,对修改关闭。

就是说对于一个项目或者某个功能点,现要增加一个新的扩展功能,最好应该在不改变现有代码的前提下,植入新的代码,既不影响现有功能,又能够实现我们新增的功能,并且没有修改现有代码。

个人理解,就好比我现在想喝豆浆,并且只有黄豆,那我就需要一台豆浆机,这个豆浆机暂时把它理解为一个软件实体,突然有一天,欲望膨胀了,我又想和西瓜汁,那么我需要去准备西瓜,但是又不想再买榨汁机,想使用豆浆机来试着榨一杯西瓜汁,那么,在我不对当前的豆浆机做任何改变的前提下,能够榨出一杯西瓜汁,那么原来这台豆浆机,就符合开闭原则;如果我需要对当前豆浆机做出一些零部件的调整,才能和西瓜汁,那么就违反了开闭原则。如果不论怎么改都榨不出西瓜汁,那么就只能喝豆浆(个人意见,若有错误,请评论指出,谢谢)

  • 目的

为了代码的可扩展性,并且避免了对现有代码的修改给软件带来风险。

  • 先学习下面的简单工厂模式,之后我们再回来看一下,简单工厂模式是如何违反开闭原则的。

二、简单工厂模式的实现:

  • 定义:定义一个工厂类,根据传入的参数的值不同,返回不同的实例(所有的实例都由仅有的这个工厂来创建)
  • 特点:被创建的实例具有共同的父类或接口
  • 结构:

一个用于创建实例的工厂类

一个接口,所有被创建的实例都要实现该接口

现在想定义一个工厂,用来创建不同的鼠标。上图中,分别定义了 DellMouse 和 HpMouse 且都实现了Mouse接口,同时也都实现了 Mouse 接口中的 sayHi() 方法。又创建了一个叫 MouseFactory 的工厂类,并通过调用该类的 createMouse() 方法,根据传入不同的i值,来决定创建特定类型的鼠标实例,来返回给业务层调用。

比如传入0的时候,就会返回一个DellMouse的实例,并返回。这样,便能在业务需要的时候,调用MouseFactory的静态方法createMouse(),获取我们需要的特定实例,并调用实例的sayHi方法来满足业务需求。

  • 代码实现:

1.首先创建Mouse接口以及DellMouse和HpMouse,并实现sayHi方法:

三个类的具体实现如下:

//Mouse接口
public interface Mouse {public void sayHi();
}
//HpMouse类
public class HpMouse implements Mouse {@Overridepublic void sayHi() {System.out.println("我是惠普鼠标");}
}
//DellMouse类
public class DellMouse implements Mouse {@Overridepublic void sayHi() {System.out.println("我是戴尔鼠标");}
}

2.创建对应的MouseFactory工厂类,用来返回对应的工厂类

具体实现如下:

public class MouseFactory {public static Mouse createMouse(int type){switch (type){case 0 : return new DellMouse();case 1 : return new HpMouse();default:return new DellMouse();}}public static void main(String[] args) {Mouse mouse = MouseFactory.createMouse(1);mouse.sayHi();}
}

执行main方法,输出如下:

我是惠普鼠标

上面的工厂类,就实现了,根据传入不同的参数,来返回不同的实例。当前例子中,传入1,就返回HpMouse,再通过Mouse接口的sayHi方法,来调用不同实现类的sayHi方法,就实现了简单工厂模式。

在简单工厂中,隐藏了对象创建的细节,客户端不需要自己创建实例,只需要告诉工厂,需要哪个具体实现类就可以。

  • 适用场景:

1.需要创建的对象比较少。

在上面的例子中,我们只是创建了两个鼠标实现类,如果需要几十个上百个具体的实现类的情况,那么在工厂类的switch或者if else语句中就要写很多行代码,很笨重。

2.客户端不关心对象的创建过程

该特点同样适用与其他工厂模式。上面的例子中,就不需要了解DellMouse或者HpMouse实例的创建过程,直接在需要的地方传入不同参数调用就好了。

  • 优缺点:
  • 优点:

可以对创建的对象进行“加工”,对客户端隐藏相关细节。只关注结果,无需了解过程

  • 缺点:

1. 若创建逻辑复杂或创建对象过多,则会造成代码臃肿

2. 新增、删除子类均会违反开闭原则

三、简单工厂模式违反了开闭原则

还是上面的鼠标工厂,现在有了新需求,除了DellMouse和HpMouse,我们还需要LenovoMouse,那就需要对现有代码做些调整。

1. 首先新增LenovoMouse的实现类,实现Mouse接口:

public class LenovoMouse implements Mouse {@Overridepublic void sayHi() {System.out.println("我是联想鼠标");}
}

仅新增联想鼠标的做法,是符合开闭原则的,毕竟我们只扩展出了一个LenovoMouse的实现类,且没有修改当前代码。

2. 接下来需要修改工厂类MouseFactory,使其能够创建出LenovoMouse的实例

public class MouseFactory {public static Mouse createMouse(int type){switch (type){case 0 : return new DellMouse();case 1 : return new HpMouse();case 2 : return new LenovoMouse();default:return new DellMouse();}}public static void main(String[] args) {Mouse mouse = MouseFactory.createMouse(2);mouse.sayHi();}
}

在工厂中,我们在 switch 语句中添加了一条case, 为了能够让工厂返回LenovoMouse实例。

此时,因为修改了原有工厂类的方法,就违背了开闭原则。

四、建议

所有原则并非一定要严格遵守,而是需要结合业务的实际情况。

上面的例子中,如果我们只需要创建这几个Mouse的实现类,使用简单工厂,违背一下开闭原则也不是不可以。

简单工厂模式的实现及优缺点相关推荐

  1. 设计模式(四)简单工厂模式

    首先,简单工厂模式不属于23中涉及模式,简单工厂一般分为:普通简单工厂.多方法简单工厂.静态方法简单工厂. 1.简单工厂模式简介 定义 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 简单 ...

  2. 设计模式(4)—— 简单工厂模式(Simple Factory,创建型)

    1.概述 使用设计模式可以提高代码的可复用性.可扩充性和可维护性.简单工厂模式(Simple Factory Pattern)属于创建型模式.简单工厂模式,由一个工厂对象决定创建出哪一种产品类的实例, ...

  3. 秒懂设计模式之简单工厂模式(Simple Factory Pattern)

    版权申明]非商业目的可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/86634864 出自:shusheng007 设计模式 ...

  4. 设计模式----2(简单工厂模式的概念,简单工厂模式的实现,简单工厂模式的优缺点)

    简单工厂模式 简单工厂模式的概念 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负 责创建其他类的实例,被创建的实例通常都具有共同的父类. 具体分类 工厂(Creator ...

  5. python工厂模式 取代__init___浅析Python 简单工厂模式和工厂方法模式的优缺点

    前言 在<设计模式>一书中工厂模式提到了: 工厂方法模式(Factory Method) 抽象工厂模式 (Abstract Factory) 但是在实际过程中还有一种工厂模式经常被使用,那 ...

  6. JavaScript 前端简单工厂模式、工厂方法模式、抽象工厂模式优缺点及详解 — 设计模式《二》

    工厂模式 前言:就前端 JavaScript 语言来说,可以把简单工厂模式.工厂方法模式.抽象工厂模式归纳为一种即工厂模式: 一. 简单工厂模式 介绍/概述: 简单工厂模式的工厂类一般是使用静态方法, ...

  7. JAVA工厂模式优缺点_简单工厂模式、工厂模式和抽象工厂模式区别及优缺点

    各位小伙伴好,今天给大家主要介绍一下简单工厂模式.工厂模式和抽象工厂模式的区别及各自的优缺点. (本文实现语言为Python3) [前言] 众所周知今天所讲的内容是 设计模式的一类:对于设计模式这个概 ...

  8. 简单工厂模式、工厂模式和抽象工厂模式区别及优缺点

    各位小伙伴好,今天给大家主要介绍一下简单工厂模式.工厂模式和抽象工厂模式的区别及各自的优缺点. (本文实现语言为Python3) [前言] 众所周知今天所讲的内容是设计模式的一类:对于设计模式这个概念 ...

  9. 工厂模式(简单工厂模式、工厂方法模式优缺点,使用场景)

    工厂模式,优缺点以及存在的意义 1.简单工厂模式(静态工厂模式) 2.工厂方法模式 工厂模式的本质 实例化对象不使用new,用工厂方法代替 将选择实现类,创建对象统一管理和控制.从而将调用者跟我们的实 ...

最新文章

  1. php调用系统浏览器代码,php判断操作系统或浏览器实现代码
  2. myBatis抛出异常Result Maps collection already contains value ...
  3. c语言错误解析-变量声明
  4. 【python】装饰器的练习题
  5. mongodb ssl java_MongoDB自签名SSL连接:SSL对等证书验证失败
  6. 【2019数学建模】国赛C题:机场出租车优化问题(原创)
  7. synchronize偏向锁底层实现原理
  8. 使用application对象实现网站访问量统计
  9. js中 new,self和this的用法解释
  10. ZigBee技术[转]
  11. 计算机主机箱背后的接口,计算机主机背面有哪些接口
  12. go 学习笔记之无心插柳柳成荫的接口和无为而治的空接口
  13. python如何提交作业_python分析作业提交情况
  14. 最后一公里极速配送(一)
  15. java生成大小写字母加数字的随机数
  16. HTTP请求的过程与TCP连接的过程
  17. IDEA中下方git的提交记录上有黄、绿、紫色标记的意思
  18. 驱动开发 环境搭建(Win7-VS2008+WDK+DDKWzard)
  19. 【C语言编程】 大小写字母互换
  20. ROW_NUMBER()函数使用详解

热门文章

  1. 终于搞懂红黑树!--红黑树的原理及操作
  2. java课程设计心得体会绪论
  3. ULN2803驱动模块的使用
  4. 如何用C语言简单加密文件+
  5. 谷歌地图kml能透明吗_如何使用谷歌地图的KML文件快速计算面积
  6. 自动化项目倍加福WCS-PG210E使用GSD文件
  7. 字符串为null 和 字符串长度为0
  8. TM影像各波段及波段组合情况
  9. 日期时间存入数据库会差一天?
  10. 什么是IDC?数据中心该如何选择?