工厂模式

简单工厂模式(不属于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 类的动作放在一个工厂方法中,并返回;
    • 不要让类继承具体类,而是继承抽象类或者是实现接口;
    • 不要覆盖基类中已经实现的方法。

最新文章

  1. ID属性值为小数
  2. 【leedcode】add-two-numbers
  3. AngularJS $http配置为form data 提交
  4. LeetCode:Gray Code(格雷码)
  5. poj 1986
  6. MySQL之连接数据库的两种方法
  7. js图片放大镜 可动态更换图片
  8. docker学习笔记:容器的网络设置
  9. hdu5338 ZZX and Permutations
  10. C++学习之路—继承与派生(三):多重继承与虚基类
  11. 安装aptana(1)
  12. webpack的安装与使用
  13. (NO.00001)iOS游戏SpeedBoy Lite成形记(九)
  14. Python Bs4 回顾
  15. conda 常用命令
  16. Rosserial实现Windows-ROS交互操作
  17. layer的alert图
  18. 说说http协议中的编码和解码
  19. 华为OJ:2199 推断输入字符串中的括号匹配
  20. JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式

热门文章

  1. IIC通信控制的AD5259------在调试过程中遇到的奇葩问题
  2. FFT算法的verilog实现
  3. C语言数据类型char
  4. Android开发之《USB Camera》
  5. python标准库:csv 模块
  6. Python---12函数式编程------12.3匿名函数&装饰器&偏函数
  7. 吴裕雄--天生自然 python数据分析:葡萄酒分析
  8. 吴裕雄--天生自然 python开发学习笔记:下载python离线安装whl文件链接
  9. flask_admin+flask_login 整合,jieba分词+echarts数据分析可视化
  10. 实现子数组和绝对值差最小 - Objective-C