设计模式——工厂模式

定义:

定义一个接口,让创建对象延伸到子类,工厂方法让实例化延伸到子类。

简单工厂VS工厂模式:

简单工厂类最大的有点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件,动态的实例化相关的类,对于客户端来说,去除了与具体产品的实现。

简单工厂类中,我们采用的是计算器的Demo,我们的计算器实现了加减乘除,如果这时,我们想给我们计算器增加一个开方的功能的,我们需要修改工厂类,这个时候,我们就违背了我们的设计原则开放封闭原则了。

我们采取一个措施,把原来的工厂类,根据依赖倒转原则,抽象出来,成为一个接口。这个接口,不去关心如何创建对象,仅仅给实现的的子类提供必须要实现的功能。

UML图:

 

老规矩,代码中参悟。

Demo:
根据简单工厂模式的中的Demo的改版。

Operation:

public abstract class Operation {
    int FirstNum;
    int SecondNum;

    public int getFirstNum() {
        return FirstNum;
    }

    public void setFirstNum(int firstNum) {
        FirstNum = firstNum;
    }

    public int getSecondNum() {
        return SecondNum;
    }

    public void setSecondNum(int secondNum) {
        SecondNum = secondNum;
    }

    public abstract int getResult() throws Exception;
}

OperationImpl:

//加法
class OperationAddImpl extends Operation {
    @Override
    public int getResult() {
        return FirstNum + SecondNum;
    }

}

//除法
class OperationDivImpl extends Operation {
    @Override
    public int getResult() throws Exception {
        if (SecondNum == 0) {
            throw new Exception("被除数不能为0");
        } else {
            return FirstNum / SecondNum;
        }
    }

}

//减法
class OperationSubImpl extends Operation {

    @Override
    public int getResult() {
        return FirstNum - SecondNum;
    }

}

//乘法
class OperationMulDivImpl extends Operation {
    @Override
    public int getResult() {
        return FirstNum * SecondNum;
    }

}

Factory:

public interface Factory {
    public Operation create();
}

FactoryImpl:

class FactoryAdd implements Factory {
    @Override
    public Operation create() {
        return new OperationAddImpl();
    }
}

class FactorySub implements Factory {
    @Override
    public Operation create() {
        return new OperationSubImpl();
    }
}

class FactoryMulDiv implements Factory {
    @Override
    public Operation create() {
        return new OperationMulDivImpl();
    }
}

class FactoryDiv implements Factory {
    @Override
    public Operation create() {
        return new OperationMulDivImpl();
    }
}

Client:

public class Client {
    public static void main(String[] args) throws Exception {
        Factory factory = new FactoryAdd();
        Operation oper = factory.create();
        oper.setFirstNum(10);
        oper.setSecondNum(2);
        System.out.println(oper.getResult());
    }
}

总结:

工厂模式是从简单工厂模式衍生出来的,解决了简单工厂模式存在一些问题,例如解决了简单工厂违反开放封闭原则的问题。

posted @ 2019-01-16 19:16  tujietg  阅读(159)  评论(0编辑  收藏  举报