【读书笔记】《大话设计模式》工厂方法模式

1.什么是工厂方法模式?

 工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。

2.工厂方法模式的作用?

 工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

3.UML图

 下图为计算器程序工厂方法模式的UML图结构:
在这里插入图片描述

4.工厂方法模式实现

 下面为计算器程序工厂方法模式的代码实现:

//运算类的抽象类
abstract class Operation {
    
    
	private double numberA = 0;
	private double numberB = 0;

	public void setNumberA(double numberA) {
    
    
		this.numberA = numberA;
	}
	
	public double getNumberA() {
    
    
		return numberA;
	}
	
	public void setNumberB(double numberB) {
    
    
		this.numberB = numberB;
	}

	public double getNumberB() {
    
    
		return numberB;
	}

	public abstract double getResult();
}

//加法类
public class Add extends Operation {
    
    
    @Override
    public double getResult() {
    
    
        return getNumberA() + getNumberB();
    }
}

//减法类
public class Sub extends Operation {
    
    
    @Override
    public double getResult() {
    
    
        return getNumberA() - getNumberB();
    }
}

//乘法类
public class Mul extends Operation {
    
    
    @Override
    public double getResult() {
    
    
        return getNumberA() * getNumberB();
    }
}

//除法类
public class Div extends Operation {
    
    
    @Override
    public double getResult() {
    
    
        if (getNumberB() == 0)
            return 0;

        return getNumberA() / getNumberB();
    }
}


//工厂接口
interface IFactory {
    
    
	Operation createOperation();
}
//加法类工厂
public class AddFactory implements IFactory {
    
    
    @Override
    public Operation createOperation() {
    
    
        return new Add();
    }
}

//减法类工厂
public class SubFactory implements IFactory {
    
    
    @Override
    public Operation createOperation() {
    
    
        return new Sub();
    }
}

//乘法类工厂
public class MulFactory implements IFactory {
    
    
    @Override
    public Operation createOperation() {
    
    
        return new Mul();
    }
}

//除法类工厂
public class DivFactory implements IFactory {
    
    
    @Override
    public Operation createOperation() {
    
    
        return new Div();
    }
}

//客户端代码
public class Main {
    
    
    public static void main(String[] args) {
    
    
        IFactory factory1 = new AddFactory();
        Operation operation1 = factory1.createOperation();
        operation1.setNumberA(2.0);
        operation1.setNumberB(3.0);
        System.out.println(operation1.getResult());

        IFactory factory2 = new SubFactory();
        Operation operation2 = factory2.createOperation();
        operation2.setNumberA(2.0);
        operation2.setNumberB(3.0);
        System.out.println(operation2.getResult());

        IFactory factory3 = new MulFactory();
        Operation operation3 = factory3.createOperation();
        operation3.setNumberA(2.0);
        operation3.setNumberB(3.0);
        System.out.println(operation3.getResult());
        
        IFactory factory4 = new DivFactory();
        Operation operation4 = factory4.createOperation();
        operation4.setNumberA(2.0);
        operation4.setNumberB(3.0);
        System.out.println(operation4.getResult());

    }
}

 客户端结果截图:
在这里插入图片描述

5.简单工厂vs工厂方法

 下图为简单工厂方法模式的计算器程序UML图:
在这里插入图片描述



 下图为工厂方法模式的计算器程序UML图:
在这里插入图片描述
 通过对比两张UML图我们可以发现如下区别:

  • 简单工厂模式在工厂类中包含了必要的逻辑判断(例如:决定要实例化加法类还是减法类) ,当添加其他运算类的时候,需要修改工厂类,这违背了开放-封闭原则(开放-封闭原则就是避免修改已存在的类,尽量通过扩展类来达到修改的目的)。
  • 工厂方法实现时,由客户端决定实例化哪一个工厂来实现运算类,这样就不用修改已存在的类了(客户端代码暂不归属于功能类,上面说的避免修改已存在的类是指功能类),例如,当需要添加平方运算类的时候,只需要平方运算类继承运算类,平方工厂实现工厂类,然后修改客户端就可以了,这样就避免了修改已存在的类以及类的结构。

猜你喜欢

转载自blog.csdn.net/Handsome_Le_le/article/details/108914749
今日推荐