工厂模式开篇-介绍+简单工厂

工厂模式

工厂设计模式的原则

  1. OCP原则,即系开闭原则。代码应该对扩展开发,对修改关闭。
  2. 依赖抽象原则(面向接口)。类应该尽量依赖接口、或者抽象类。
  3. 不继承非抽象类,就算继承了也尽量不要修改其代码。

工厂设计模式应用背景

在对象中,如果要频繁根据条件,创建某类对象,就应该使用工厂设计模式。把创建这类对象的代码(可能变化的代码),与使用这些代码的(客户端)使用端,分离。

同时,使用了工厂模式,代替new的操作。相当于在引用与对象之间,加了一层缓冲,使得代码的结构更加灵活。

工厂设计模式

工厂设计模式分为

  1. 简单工厂(静态工厂)
  2. 工厂方法
  3. 抽象工厂(感觉用得最多的)

以上三种的核心思想:其实都是讲可能会变化的new的操作,与不变化使用端的代码进行分离。

简单工厂模式

案例:一间肠粉店卖肠粉专做外卖,一份肠粉的流程是:

  1. 根据客人订单准备肠粉的材料(虾饺、瘦肉、鸡蛋。。。) prepare
  2. 蒸熟肠粉 cook
  3. 配上美美的酱油 oil
  4. 用外卖盒打包 box

如果现在要做一个小程序,实现上面的功能,要怎么设计类?

常规做法


public class CDF {
    String getType(){
        return "egg";
    }

    void createOrder(){
        CF order = null;
        String type = this.getType();
        if(type == "egg") {
            order = new EggCF();
        }else if(type == "pork"){
            order = new PorkCF();
        }else if(type == "beef"){
            order = new BeefCF();
        }else{
            System.out.println("本店无此类肠粉");
            return;
        }

        //开始做单
        order.prepare();
        order.cook();
        order.oil();
        order.box();
        System.out.println("完成订单");
    }
}

按照这种做法,每次添加新的肠粉类,就要修改这个CDF类。显然,把变化的部分抽离,又因为要创建对象所以,可以利用简单工厂。

优化

public class CFfactory {
    public static CF createCF(String type){
        CF order = null;
        if(type == "egg") {
            order = new EggCF();
        }else if(type == "pork"){
            order = new PorkCF();
        }else if(type == "beef"){
            order = new BeefCF();
        }else{
            System.out.println("本店无此类肠粉");

        }
        return order;
    }
}

public class CDF {
    String getType(){
        return "pork";
    }

    void createOrder(){
        CF order = CFfactory.createCF(this.getType());

        //开始做单
        order.prepare();
        order.cook();
        order.oil();
        order.box();
    }
}

这样左后,就算添加了新的类型,只要修改factory的代码,和添加一个新的类型就可以。
同时,如果有多个使用端同时需要CF对象,那么只需要集中修改工厂,不要修改其他的使用端代码。

原文地址:https://www.cnblogs.com/custoyth/p/13267962.html