工厂模式-简单工厂模式


工厂模式-简单工厂模式

工厂模式(Factory Pattern)是最常用的一类创建型设计模式,包含简单工厂模式(Simple Factory Pattern)、工厂方法模式(Factory Method Pattern)和抽象工厂模式(Abstract Factory Pattern)

简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态方法,因此简单工厂模式又称为静态工厂方法模式(Static Factory Method Pattern)

我们看一个具体的需求

一个披萨的项目,要便于披萨种类的拓展,要便于维护

  1. 披萨的种类有很多(比如 GreekPizz、CheesePizz等)
  2. 披萨的制作有prepare,bake,cut,box
  3. 完成披萨店的订购功能
public abstract class Pizza {
    //pizza的名字
    protected String name;

    //准备原材料,不同pizza的原材料不一样,因此做成抽象方法
    public abstract void prepare();

    public void bake(){
        System.out.println(name + " baking;");
    }

    public void cut(){
        System.out.println(name + " cutting;");
    }

    public void box(){
        System.out.println(name + " boxing;");
    }

    public void setName(String name) {
        this.name = name;
    }
}
public class CheesePizza extends Pizza{
    @Override
    public void prepare() {
        System.out.println("制作奶酪披萨 准备原材料");
    }
}
public class GreekPizza extends Pizza{
    @Override
    public void prepare() {
        System.out.println("给希腊披萨准备原材料");
    }
}
/**
 * 简单工厂类
 * 如果要增加披萨类直接修改工厂类即可
 */
public class SimpleFactory {
    //根据orderType 返回对应的Pizza对象
    public static Pizza createPizza(String orderType){
        Pizza pizza = null;
        System.out.println("使用简单工厂模式");

        if (orderType.equals("greek")){
            pizza = new GreekPizza();
            pizza.setName("希腊披萨");
        }else if (orderType.equals("cheese")){
            pizza = new CheesePizza();
            pizza.setName("奶酪披萨");
        }
        return pizza;

    }
}
public class OrderPizza {

    Pizza pizza = null;
    String orderType = "";//用户输入

    //构造器
    public OrderPizza(){
        do{
            orderType = getType();
            pizza = SimpleFactory.createPizza(orderType);

            //输出pizza
            if (pizza != null){
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
            }else {
                System.out.println("订购pizza失败");
                break;
            }
        }while (true);
    }

    private String getType(){
        try{
            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("input pizza type:");
            String str = strin.readLine();
            return str;
        }catch (IOException e){
            e.printStackTrace();
            return "";
        }
    }
}
public class PizzaStore {
    public static void main(String[] args) {
        new OrderPizza();
        System.out.println("退出程序");

    }
}

Author: qwq小小舒
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source qwq小小舒 !
  TOC