再次回顾设计模式——工厂三姐妹

2024-05-25 13:58

本文主要是介绍再次回顾设计模式——工厂三姐妹,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  设计模式可谓再熟悉不过了,工厂三姐妹是设计模式中最常见的,也是面试中最常问的,但是就在昨天联想面试的时候面试官问我工厂方法和抽象工厂的区别,我心里特别明白两者之间的关系,但是就是用语言组织不起来,说了半天面试官也只能听懂个大概。还是平时总结的少,今天我们重新回顾一下这三个设计模式。

  工厂是什么意思呢?结合三者的特点,我认为可以这样理解:工厂可以看做一个特殊的类,在这个类中专门负责生产一系列产品(对象)的一个集合就可以成为工厂。
那么上述三种模式之间究竟是怎样的关系呢?各自又有什么优缺点呢?

一、简单工厂模式 VS 工厂方法模式

1、先来看一个简单工厂的一段代码:

<span style="font-family:KaiTi_GB2312;font-size:18px;">public class OperationFactory  {  //声明一个方法用来实例化,可是为什么要用静态方法呢                                            public  static Operation createOperate(string operate)                              {  Operation oper = null;  switch (operate )  {  //通过分支语句对子类进行实例化                                                          case "+":  oper = new OperationAdd();  break;  case "-":  oper = new OperationSub();  break;  case "*":  oper=new OperationMul ();  break;  case "/":  oper =new OperationDiv ();  break;  }  return oper ;  } </span>

  通过代码我们可以看出,在简单工厂中,可以讲多种需要实例化的对象在一个分支结构中一次性的完成。具体的选择要留给客户端去做。
例如:

<span style="font-family:KaiTi_GB2312;font-size:18px;">oper= OperationFactory.createOperate("+");</span>
那我们继续扩展,当我们想要在程序中增加一种算法符号,这时,我们必须对简单工厂中的分支语句进行修改,这样其实就违背了设计模式中的开放——封闭原则。为了避免对内修改,我们再来看一下工厂方法模式。

2、工厂方法模式

       核心思想:创建一个接口,子类去实现这个接口,同时,根据子类来决定究竟要实例化哪个对象。
看一段代码:
<span style="font-family:KaiTi_GB2312;font-size:18px;"> interface IFactory //定义一个接口  {//非静态                                                                                                                           Operation CreateOperation();  }  class AddFactory:IFactory  {  public Operation CreateOperation()  {  return new OperationAdd();//子类j决定具体对哪个子类进行实例化  }  }  class SubFactory:IFactory  {  public Operation CreateOperation()  {  return new OperationSub();  }  }</span>

其余代码类似略。
   通过工厂方法模式,我们可以发现,如果现在再增加一个运算符的话,我们只需要额外增加一个运算符子类和实现接口的子类就好了,而不用去对已经写好的类进行修改了。可见与简单工厂相比,工厂方法模式遵循了开放——封闭原则:即对外扩展,对内封闭。
还有一个小小的区别:在简单工厂中用static声明方法为静态方法,而工厂方法中却未用到静态方法,原因是:在简单工厂中由于不需要子类进行继承,所以使用静态方法可以避免实例化,可以用类来直接调用方法。而在工厂方法中由于存在继承关系,所以不能使用静态方法

二、 工厂方法 VS 抽象工厂

      我认为其实这二者本属于一类。
      最主要的区别是:
      工厂方法:涉及到的是只需定义一个产品类和一个对象接口,可以派生出多个子类。
      而抽象工厂:定义一系列即多个产品类和多个对象接口,分别派生出多个子类。
     这里,不多做解释。

三、简单工厂 VS 抽象工厂

    在抽象工厂中可以定义多个产品类和对象接口,可是,如果我们想要在此基础上多加一个产品,那么此时,需要增加的类就会很多,同时还需要去更改涉及到的各个工厂。这其实无形中就已经增加了代码的维护量。对于编程来说又是一个不好的兆头。那么有什么办法可以改进它呢?其实,简单工厂可以弥补这个缺陷。

举一个大话设计模式中的例子:创建数据库:SqlServer和Access两类,同时包含IUser和IDepartment两张表如果用抽象工厂方法来设计如图:


  如图,如果此时,我们想要在增加一个项目表Project时,必须增加项目接口,SqlserverProject和AccessProject的类同时,还必须修改企业两个工厂,在两个工厂中增加实例化Project的项,造成代码维护量增加。
此时,如果我们把IFactory抽象工厂用一个DataAccess来代替,同时增加一个字符串变量,利用简单工厂来实例化字符串变量中所指定的数据库。
简单工厂方法的类图如下:


  当然,我们可以看出来,利用简单工厂方法,虽然改动相对少了,但是仍然违背了开放——封闭原则,因为在增加其他表时,仍需要改动DataAccess中的分支语句,所以,对于简单工厂和抽象工厂方法二者应该酌情使用,二者都有自己的优点和缺点,我们应该根据具体情况具体分析。
当然为了进一步改进,大话设计模式中还提到了利用“反射”和配置文件的技术。总之,设计模式是一门艺术,只有更好,没有最好!

这篇关于再次回顾设计模式——工厂三姐妹的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1001700

相关文章

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma

Java基础回顾系列-第三天-Lambda表达式

Java基础回顾系列-第三天-Lambda表达式 Lambda表达式方法引用引用静态方法引用实例化对象的方法引用特定类型的方法引用构造方法 内建函数式接口Function基础接口DoubleToIntFunction 类型转换接口Consumer消费型函数式接口Supplier供给型函数式接口Predicate断言型函数式接口 Stream API 该篇博文需重点了解:内建函数式

Java基础回顾系列-第二天-面向对象编程

面向对象编程 Java类核心开发结构面向对象封装继承多态 抽象类abstract接口interface抽象类与接口的区别深入分析类与对象内存分析 继承extends重写(Override)与重载(Overload)重写(Override)重载(Overload)重写与重载之间的区别总结 this关键字static关键字static变量static方法static代码块 代码块String类特

Java基础回顾系列-第六天-Java集合

Java基础回顾系列-第六天-Java集合 集合概述数组的弊端集合框架的优点Java集合关系图集合框架体系图java.util.Collection接口 List集合java.util.List接口java.util.ArrayListjava.util.LinkedListjava.util.Vector Set集合java.util.Set接口java.util.HashSetjava

Java基础回顾系列-第九天-数据库编程

Java基础回顾系列-第九天-数据库编程 数据库简介工具包java.sql API 内容与数据库建立连接执行SQL语句数据库检索和更新查询结果SQL类型对应Java类型映射元数据异常 API方法DriverManagerConnectionStatementPreparedStatementCallableStatementResultSetjava.sql.Date批处理、存储过程、事务

Java基础回顾系列-第一天-基本语法

基本语法 Java基础回顾系列-第一天-基本语法基础常识人机交互方式常用的DOS命令什么是计算机语言(编程语言) Java语言简介Java程序运行机制Java虚拟机(Java Virtual Machine)垃圾收集机制(Garbage Collection) Java语言的特点面向对象健壮性跨平台性 编写第一个Java程序什么是JDK, JRE下载及安装 JDK配置环境变量 pathHe

设计模式之工厂模式(通俗易懂--代码辅助理解【Java版】)

文章目录 1、工厂模式概述1)特点:2)主要角色:3)工作流程:4)优点5)缺点6)适用场景 2、简单工厂模式(静态工厂模式)1) 在简单工厂模式中,有三个主要角色:2) 简单工厂模式的优点包括:3) 简单工厂模式也有一些限制和考虑因素:4) 简单工厂模式适用场景:5) 简单工厂UML类图:6) 代码示例: 3、工厂方法模式1) 在工厂方法模式中,有4个主要角色:2) 工厂方法模式的工作流程