简单工厂模式

简单工厂模式:

  披萨店需要生产各式各样的披萨,披萨必须经过准备,烘烤,切片,包装几个步骤进行生产,但是可以有各种各样的品种,比如奶酪披萨,蛤蜊披萨,意大利披萨,蔬菜披萨等等。

但是各个地方的人又有不同的口味,比如原生口味,重庆风味,湖南风味等等。

  代码实现:

1,创建披萨接口

package factorymode.simplefactory;

/**
 * @ClassName Pizaa
 * @Description 定义披萨接口
 * @Author liuyi
 * @Date 2020/6/15 20:50
 * @Version 1.0
 */
public interface Pizaa {

    //准备
    public void prepare();
    //烘烤
    public void bake();
    //切片
    public void cut();
    //包装
    public void box();

}

2,创建四种原生口味的披萨

package factorymode.simplefactory;

/**
 * @ClassName CheesePizza
 * @Description 奶酪披萨
 * @Author liuyi
 * @Date 2020/6/15 20:58
 * @Version 1.0
 */
public class CheesePizza implements Pizaa{
    @Override
    public void prepare() {
        System.out.println("准备生产奶酪披萨");
    }

    @Override
    public void bake() {
        System.out.println("烘烤奶酪披萨");
    }

    @Override
    public void cut() {
        System.out.println("切片奶酪披萨");
    }

    @Override
    public void box() {
        System.out.println("包装奶酪披萨");
    }
}

  

package factorymode.simplefactory;

/**
 * @ClassName ClamPizza
 * @Description 蛤蜊披萨
 * @Author liuyi
 * @Date 2020/6/15 21:00
 * @Version 1.0
 */
public class ClamPizza implements Pizaa{
    @Override
    public void prepare() {
        System.out.println("准备生产蛤蜊披萨");
    }

    @Override
    public void bake() {
        System.out.println("烘烤蛤蜊披萨");
    }

    @Override
    public void cut() {
        System.out.println("切片蛤蜊披萨");
    }

    @Override
    public void box() {
        System.out.println("包装蛤蜊披萨");
    }
}

  

package factorymode.simplefactory;

/**
 * @ClassName PepperoniPizza
 * @Description 意大利披萨
 * @Author liuyi
 * @Date 2020/6/15 21:01
 * @Version 1.0
 */
public class PepperoniPizza implements Pizaa{
    @Override
    public void prepare() {
        System.out.println("准备生产意大利披萨");
    }

    @Override
    public void bake() {
        System.out.println("烘烤意大利披萨");
    }

    @Override
    public void cut() {
        System.out.println("切片意大利披萨");
    }

    @Override
    public void box() {
        System.out.println("包装意大利披萨");
    }
}

  

package factorymode.simplefactory;

/**
 * @ClassName VeggiePIzza
 * @Description 蔬菜披萨
 * @Author liuyi
 * @Date 2020/6/15 21:00
 * @Version 1.0
 */
public class VeggiePIzza implements Pizaa{
    @Override
    public void prepare() {
        System.out.println("准备生产蔬菜披萨");
    }

    @Override
    public void bake() {
        System.out.println("烘烤蔬菜披萨");
    }

    @Override
    public void cut() {
        System.out.println("切片蔬菜披萨");
    }

    @Override
    public void box() {
        System.out.println("包装蔬菜披萨");
    }
}

3,定义简单工厂,用来生产披萨

package factorymode.simplefactory;

/**
 * @ClassName SimplePizzaFactory
 * @Description 生产披萨的简单工厂
 * @Author liuyi
 * @Date 2020/6/15 21:03
 * @Version 1.0
 */
public class SimplePizzaFactory {
    public Pizaa createPizza(String type){
        Pizaa pizaa = null;
        switch (type){
            case "cheese":
                pizaa = new CheesePizza();
                break;
            case "clam":
                pizaa = new ClamPizza();
                break;
            case "pepperoni":
                pizaa = new PepperoniPizza();
                break;
            case "veggie":
                pizaa = new VeggiePIzza();
                break;
        }
        return pizaa;
    }
}

4,定义购买披萨的商店

package factorymode.simplefactory;

/**
 * @ClassName PizzaStrore
 * @Description 定义购买披萨的商店
 * @Author liuyi
 * @Date 2020/6/15 21:07
 * @Version 1.0
 */
public class PizzaStrore {
    SimplePizzaFactory factory;
    public PizzaStrore(SimplePizzaFactory factory){
        this.factory = factory;
    }

    //订购披萨方法
    public Pizaa orderPizza(String type){
        Pizaa pizaa;
        pizaa = factory.createPizza(type);
        pizaa.prepare();
        pizaa.bake();
        pizaa.cut();
        pizaa.box();
        return pizaa;
    }
}

  代码的实现很简单,就是把创建具体披萨种类,也就是具体的对象交给了简单工厂也就是SimplePizzaFactory去创建。这样做的目的就是让我们的程序和具体类解耦。简单的说法就是不在程序中直接new 一个对象。

那么这样做到底有什么好处呢?比如如果不用工厂去获取具体的实现类,我们在程序中new 了N多个具体类,如果这个类发生了改变,比如需要添加一个有参构造,那我们需要修改N个地方,但是如果用工厂的方式去获取,

我们只需要修改工厂这一个类即可。

原文地址:https://www.cnblogs.com/liu-yi/p/13138447.html