前言:这两天学习了简单工厂模式、工厂方法模式、抽象工厂模式,在这里详细说一下工厂方法模式。转载请注明出处:
工厂方法模式
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。
使用的设计原则:依赖倒置原则(要依赖抽象,不要依赖具体类)。对修改关闭,对扩展开放。
类图:
总结:
1、工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
2、工厂方法,可以接受传参(称为“参数化工厂方法”),根据传入的参数不同创建不同的对象。也可以不接受传参,只产生一种对象,不需要参数化。
3、利用字符串传参,有点危险,万一拼错,可能会造成所谓的“运行时错误”,所以避免方式为在编译时期就将参数的错误挑出来。比如:可以创建代表参数类型的对象、使用常量、枚举 enum。
缺点:
1、由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。
举例说明:
要求:使用面向对象实现一个计算器控制台程序,要求输入两个数字和运算符号,得到结果。
重点:使用面向对象思想。
使用工厂方法模式实现:
类图:
抽象运算类
/** * 运算抽象类 */ abstract class Operation{ private int num1; private int num2; public int getNum1() { return num1; } public void setNum1(int num1) { this.num1 = num1; } public int getNum2() { return num2; } public void setNum2(int num2) { this.num2 = num2; } public abstract double getResult(); }
具体运算类
/** * 加法运算 */ class AddOperation extends Operation{ @Override public double getResult() { return getNum1() + getNum2(); } } /** * 减法运算 */ class SubOperation extends Operation{ @Override public double getResult() { return getNum1() - getNum2(); } } /** * 除法运算 */ class DivOperation extends Operation{ @Override public double getResult() { return getNum1() / getNum2(); } } /** * 乘法运算 */ class MulOperation extends Operation{ @Override public double getResult() { return getNum1() * getNum2(); } }
抽象工厂类
/** * 抽象工厂类 */ interface IFactory{ Operation CreateOperation(); }
具体工厂类
/** * 加法工厂类 */ class AddFactory implements IFactory{ @Override public Operation CreateOperation() { return new AddOperation(); } } /** * 减法工厂类 */ class SubFactory implements IFactory{ @Override public Operation CreateOperation() { return new SubOperation(); } } /** * 除法工厂类 */ class DivFactory implements IFactory{ @Override public Operation CreateOperation() { return new DivOperation(); } } /** * 乘法工厂类 */ class MulFactory implements IFactory{ @Override public Operation CreateOperation() { return new MulOperation(); } }
客户端
public static void main(String[] args){ IFactory factory = new AddFactory(); Operation operation = factory.CreateOperation(); operation.setNum1(1); operation.setNum2(2); System.out.println(operation.getResult()); }
其他工厂模式:https://www.cnblogs.com/yuxiaole/p/9276396.html
转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9280695.html
参考书籍:《Head First 设计模式》《大话设计模式》