第8章《工厂方法模式》

前端之家收集整理的这篇文章主要介绍了第8章《工厂方法模式》前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

方法和简单工厂的对比:

添加新功能时,二者的区别:

添加一个新功能类+更改工厂类

方法需要完成工作:添加一个新功能类+添加一个生成对象的工厂+更改客户端实例化工厂的代码

方法的优点:

方法在添加功能时,需要更改工厂类,这违背了开放-封闭原则。工厂方法通过将工厂类抽象为:接口抽象工厂+多个具体生成对象的工厂,保证了在新增功能时,只需要通过添加:一个生成对象的工厂+一个新功能类,即可。如果一定要说有改写代码的地方,那就是客户端,需要添加实例化工厂的代码。此外,再无其它对方的代码修改操作。

代码来进行。之前你添加功能时,都是修改工厂类,现在是修改客户端代码

方法的缺点:

方法的缺点也是由其优点带来的:每增加一个功能类时,需要增加一个具体对象生成的工厂类,从而增进了额外的开发量。

方法在选择实例化哪一个功能类时,是在工厂类里面选择的;而工厂方法则是在客户端决定的,由客户端决定实例化哪一个工厂类,从而确定了实例化哪一个功能类。

方法模式的准确定义:

方法使一个类的实例化延迟到子类。

方法的UML图:

/**

  • @Author: cxh
  • @CreateTime: 18/1/3 23:32
  • @ProjectName: JavaBaseTest
    */
    public interface Operation {
    void setFirst(int first);
    void setSecond(int second);
    int getResult();
    }


/**

  • @Author: cxh

  • @CreateTime: 18/1/3 23:30

  • @ProjectName: JavaBaseTest
    */
    public class AddOperation implements Operation {
    private int first,second;

    @Override
    public void setFirst(int first) {
    this.first=first;
    }

    @Override
    public void setSecond(int second) {
    this.second=second;
    }

    public int getResult(){
    return first+second;
    }
    }



/**

  • @Author: cxh

  • @CreateTime: 18/1/3 23:43

  • @ProjectName: JavaBaseTest
    */
    public class MulOperation implements Operation {
    private int first,second;

    public void setFirst(int first) {
    this.first = first;
    }

    public void setSecond(int second) {
    this.second = second;
    }

    @Override
    public int getResult() {
    return first*second;
    }
    }



/**

  • @Author: cxh

  • @CreateTime: 18/1/3 23:43

  • @ProjectName: JavaBaseTest
    */
    public class MulOperation implements Operation {
    private int first,second;

    public void setFirst(int first) {
    this.first = first;
    }

    public void setSecond(int second) {
    this.second = second;
    }

    @Override
    public int getResult() {
    return first*second;
    }
    }



/**

  • @Author: cxh

  • @CreateTime: 18/1/3 23:44

  • @ProjectName: JavaBaseTest
    */
    public class DivOperation implements Operation {
    private int first,second;

    public void setFirst(int first) {
    this.first = first;
    }

    public void setSecond(int second) {
    this.second = second;
    }

    @Override
    public int getResult() {
    try{
    return first/second;
    }catch (Exception e){
    return 0;
    }
    }
    }



/**

  • @Author: cxh
  • @CreateTime: 18/1/3 23:33
  • @ProjectName: JavaBaseTest
    */
    public interface CreateFactory {
    Operation getOperation();
    }


/**

  • @Author: cxh
  • @CreateTime: 18/1/3 23:34
  • @ProjectName: JavaBaseTest
    */
    public class AddFactory implements CreateFactory {
    @Override
    public Operation getOperation() {
    return new AddOperation();
    }

}

/**

  • @Author: cxh
  • @CreateTime: 18/1/3 23:36
  • @ProjectName: JavaBaseTest
    */
    public class SubFactory implements CreateFactory {
    @Override
    public Operation getOperation() {
    return new SubOperation();
    }
    }


/**

  • @Author: cxh
  • @CreateTime: 18/1/6 11:43
  • @ProjectName: JavaBaseTest
    */
    public class MulFactory implements CreateFactory {
    @Override
    public Operation getOperation() {
    return new MulOperation();
    }
    }


/**

  • @Author: cxh
  • @CreateTime: 18/1/6 11:43
  • @ProjectName: JavaBaseTest
    */
    public class DivFacotry implements CreateFactory {
    @Override
    public Operation getOperation() {
    return new DivOperation();
    }
    }


/**

  • @Author: cxh

  • @CreateTime: 18/1/6 11:44

  • @ProjectName: JavaBaseTest
    */
    public class Client{
    public static void main(String[] args) {
    CreateFactory factory;
    Operation operation;

     //加法
     factory=new AddFactory();
     operation=factory.getOperation();
     operation.setFirst(11);
     operation.setSecond(22);
     System.out.println("11+22="+operation.getResult());
    
     //减法
     factory=new SubFactory();
     operation=factory.getOperation();
     operation.setFirst(11);
     operation.setSecond(22);
     System.out.println("11-22="+operation.getResult());
    
     //乘法
     factory=new MulFactory();
     operation=factory.getOperation();
     operation.setFirst(11);
     operation.setSecond(22);
     System.out.println("11*22="+operation.getResult());
    
     //除法
     factory=new DivFacotry();
     operation=factory.getOperation();
     operation.setFirst(22);
     operation.setSecond(11);
     System.out.println("22/11="+operation.getResult());

    }
    }

输出

猜你在找的设计模式相关文章