工厂模式

简单工厂模式(不属于23种设计模式之一)

  • 属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式;
  • 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为;
  • 使用场景:在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式。

例子:

/**
* 运算类:有一个抽象方法
*/
public abstract class Operation {
public double number1;
public double number2;
public abstract double result();
}

/**
* 加法类,继承运算类并且重写父类方法
*/
public class OperationAdd extends Operation {
@Override
public double result() {
return number1 + number2;
}
}
/**
* 减法类,继承运算类并且重写父类方法
*/
public class OperationSub extends Operation {
@Override
public double result() {
return number1 - number2;
}
}
/**
* 创建一个简单工厂
*/
public class OpreationFactory {
public static Operation createOperate(String operate){
Operation operation = null;
switch (operate){
case "+":
operation = new OperationAdd();
break;
case "-":
operation = new OperationSub();
break;
default:
System.out.println("您输入的运算符有误!");
}
return operation;
}
}
/**
* 测试类
*/
public class Calculator {
public static void main(String[] args) {
Operation operation;
String operator;
operator = "-";
operation = OpreationFactory.createOperate(operator);
operation.number1 = 10;
operation.number2 = 8;
System.out.println(operation.result());
}
}

优缺点:

  • 优点:简单易懂
  • 缺点:违背了开闭原则

工厂方法模式

  • 工厂方法模式:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类

例子:还是上面的运算例子,如果需要添加一个乘法运算的话,除了要添加一个乘法类继承运算类,还需要修改工厂代码添加一个判断,所以简单工厂模式违背了开闭原则。使用工厂模式的话只需要添加一个乘法类继承运算类以及添加一个乘法工厂实现工厂接口就可以了,完美的遵循开闭原则,代码如下:

/**
* 工厂方法
*/
public interface IFactory {
Operation createOperation();
}
/**
* 加法工厂,实现了工厂方法接口
*/
public class AddFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationAdd(); //该类见上面简单工厂方法
}
} /**
* 减法工厂,实现了工厂方法接口
*/
public class SubFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationSub(); //该类见上面简单工厂方法
}
} /**
* 乘法工厂,实现了工厂方法接口
*/
public class MultiFactory implements IFactory {
@Override
public Operation createOperation() {
return new OperationMulti();
}
}
/**
* 乘法类,继承运算类并且重写父类方法
*/
public class OperationMulti extends Operation{
@Override
public double result() {
return number1 * number2;
}
}
/**
* 测试类
*/
public class Calculator {
public static void main(String[] args) {
Operation operation;
IFactory factory = new MultiFactory();
operation = factory.createOperation();
operation.number1 = 2;
operation.number2 = 3;
System.out.println(operation.result());
}
}

优缺点:

  • 优点:遵循了开闭原则
  • 缺点:类的个数容易过多,增加了系统的复杂度

抽象工厂模式

  • 抽象工厂模式:定义了一个 interface 用于创建相关或有依赖关系的对象簇,而无需指明具体的类。
  • 抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
  • 从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者进一步的抽象)。
  • 将工厂抽象成两层,AbsFactory(抽象工厂)和具体实现的工厂子类。

优缺点:

  • 优点:让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。
  • 缺点:如果要添加一个产品类,就得增加很多代码

工厂模式在JDK中的应用

  • JDK中,Calendar类就是使用的简单工厂模式





总结

  1. 工厂模式的意义:将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦,从而提高了项目的扩展性和维护性。
  2. 三种工厂模式(简单工厂模式、工厂模式、抽象工厂模式)的区别:
    • 简单工厂模式:不符合开闭原则,只有一个具体的工厂类,当需要增加一个产品时,需要修改工厂代码
    • 工厂模式:符合开闭原则,只有一个抽象的产品类,只能生产单一产品。
    • 抽象工厂模式:符合开闭原则,有多个抽象产品类,能生产一个产品体系
  3. 设计模式的依赖抽象原则
    • 创建对象实例时,不要直接 new 类,而是把这个 new 类的动作放在一个工厂方法中,并返回;
    • 不要让类继承具体类,而是继承抽象类或者是实现接口;
    • 不要覆盖基类中已经实现的方法。

Java设计模式学习笔记三的更多相关文章

  1. Java设计模式学习笔记(三) 工厂方法模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...

  2. java设计模式学习笔记--接口隔离原则

    接口隔离原则简述 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应建立在最小的接口上 应用场景 如下UML图 类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类 ...

  3. java设计模式学习笔记--单一职责原则

    单一职责原则注意事项和细节 1.降低类的复杂度,一个类只负责一项职责 2.提高可读性,可维护性 3.降低变更引起的风险 4.通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单 ...

  4. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  5. java设计模式学习笔记--浅谈设计模式

    设计模式的目的 编写软件的过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战.设计模式为了让程序具有更好的 1.代码重用性(即:相同功能的代码,不用多次编写) ...

  6. Java IO学习笔记三:MMAP与RandomAccessFile

    作者:Grey 原文地址:Java IO学习笔记三:MMAP与RandomAccessFile 关于RandomAccessFile 相较于前面提到的BufferedReader/Writer和Fil ...

  7. Java设计模式学习笔记(五) 单例模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 使用单例模式的原因 以Windows任务管理器为例,在Windows系统中,任务管理器是唯 ...

  8. Java设计模式学习笔记(二) 简单工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...

  9. JAVA WEB学习笔记(三):简单的基于Tomcat的Web页面

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

随机推荐

  1. orcale 11g安装,创建表空间,用户,授权用户

    一.卸载旧oracle 用Oracle自带的卸载程序不能从根本上卸载Oracle,从而为下次的安装留下隐患,那么怎么才能完全卸载Oracle呢?那就是直接注册表清除,步骤如下: 1. 开始->设 ...

  2. Pycharm 2019 破解激活方法

    转载:https://blog.csdn.net/guofang110/article/details/87793264 使用破解补丁方法虽然麻烦,但是可用激活到2099年,基本上是永久激活了,毕竟在 ...

  3. java中的深拷贝

    对象拷贝有时让我们忽视其重要性,又或者因为想当然而导致若干程序问题. 浅拷贝 浅拷贝即普通拷贝,即对要拷贝的对象进行复制.例如对于Entity类: class Entity{ int a; Strin ...

  4. Mysql错误问题:ERROR 1005 (HY000): Can't create table 'crm_1.tbl_client' (errno: 150)

    MySQL外键创建条件: 1.两个表必须是InnoDB数据引擎2.外键表的外键字段必须是主键3.字段类型必须一致 创建表时创建外键: create table tbl_client(userName ...

  5. 无人工地,原来是靠AI这样运行的

    随着全世界逐渐进入老龄化社会,适龄工作人口将急剧减少,必然导致用工成本增加,施工方降低人工成本.提升施工效率和质量的需求会越来越强烈,数字化施工技术应用前景广阔.在过去的十年中,无人机迎来了自己发展的 ...

  6. 跟随大神实现简单的Vue框架

    自己用vue也不久了,学习之初就看过vue实现的原理,当时看也是迷迷糊糊,能说出来最基本的,但是感觉还是理解的不深入,最近找到了之前收藏的文章,跟着大神一步步敲了一下简易的实现,算是又加深了理解. 原 ...

  7. idea运行时默认显示的index.jsp修改方法

    在web.xml中加入以下代码,然后重启服务器就可以了. <welcome-file-list> <welcome-file>这儿写你要显示的页面名称</welcome- ...

  8. HashMap的四种遍历!

    HashMap的四种遍历 import java.util.Collection; import java.util.HashMap; import java.util.Map; import jav ...

  9. file / from install of XXX conflicts with file from package filesystem-XXX

    在centos上安装一个偏门软件时出现如下问题: rpm -ivh mNetAssist-0.1.1-2.x86_64.rpm #执行命令 file / from install of XXX con ...

  10. JavaIO 流(1)IO流介绍

    IO流定义: 流的本质是一组单向有序,分起始和终止的数据传输过程.需要导入import java.io.* IO流分类: 按数据类型分为:字节流和字符流 字节流: 按字节进行读取(可以处理任意类型数据 ...