• 设计模式5:工厂方法模式


    在之前提到的简单方法模式中,如果需要给计算器添加一种运算,需要增加一个Operation子类,然后修改工厂类。

    这样的设计一方面简化了客户端的修改,另一方面需要修改工厂类,这是违反开放-封闭模式的。

    处理这种问题的另一种方法是工厂方法模式。

    工厂方法模式克服了违反开放-封闭的缺点,同时保持了封装对象创建过程的优点,但是带来的缺点是,需要新增一个工厂类+修改客户端代码以实现功能扩展。

    来看UML图:

    四种运算的子类是继承了Operation基类,每个子类都有一个对应的工厂类,封装了创建其实例的过程。

    代码:

    Operation及其子类:

    public abstract class Operation {
    	private double numA = 0;
    	private double numB = 0;
    	
    	public double getNumA() {
    		return numA;
    	}
    
    	public void setNumA(double numA) {
    		this.numA = numA;
    	}
    
    	public double getNumB() {
    		return numB;
    	}
    
    	public void setNumB(double numB) {
    		this.numB = numB;
    	}
    	
    	public abstract double getResult();
    }
    
    public class OperationAdd extends Operation {
    
    	@Override
    	public double getResult() {
    		return getNumA() + getNumB();
    	}
    
    }
    
    public class OperationDiv extends Operation {
    
    	@Override
    	public double getResult() {
    		// TODO Auto-generated method stub
    		return getNumA() / getNumB();
    	}
    
    }
    
    public class OperationMul extends Operation {
    
    	@Override
    	public double getResult() {
    		return getNumA() * getNumB();
    	}
    
    }
    
    public class OperationSub extends Operation {
    
    	@Override
    	public double getResult() {
    		// TODO Auto-generated method stub
    		return getNumA() - getNumB();
    	}
    
    }
    

    工厂接口和子类:

    public interface IFactory {
    	public 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 MulFactory implements IFactory {
    
    	@Override
    	public Operation createOperation() {
    		return new OperationMul();
    	}
    
    }
    
    public class DivFactory implements IFactory {
    
    	@Override
    	public Operation createOperation() {
    		return new OperationDiv();
    	}
    
    }
    

    Demo:

    public class FactoryMethodDemo {
    	public static void main(String[] args) {
    		IFactory addFactory = new AddFactory();
    		Operation add = addFactory.createOperation();
    		add.setNumA(1.0);
    		add.setNumB(2.0);
    		System.out.println(add.getResult());
    	}
    }
    

      

  • 相关阅读:
    java空指针异常
    iOS 中strong,weak,copy,assign区别
    VisualSVN修改默认端口 443、8443 的 方法
    SVNServer 执行上下文错误: 远程主机强迫关闭了一个现有的连接。
    阿里云打开端口(涉及端口)的操作
    使用VisualSVN Server搭建SVN服务器(测试通过)
    SQL server触发器中 update insert delete 分别给写个例子被
    SQL中字符串截取函数(SUBSTRING)
    精选 SQL 脚本
    树形结构有关的SQL
  • 原文地址:https://www.cnblogs.com/zcy-backend/p/6671001.html
Copyright © 2020-2023  润新知