简单工厂模式与静态工厂模式详解

简单工厂模式

    首先来看一个具体需求来引出主题。
    这是一个披萨店的项目:要便于披萨种类的扩展,更要便于维护。具体需求如下:

  1. 披萨有许多种类
  2. 比萨的制作有prepare(不同披萨的具体实现不同),bake,cut,box
  3. 完成披萨店订购功能。

    从上述需求可以看出我们需要定义了一个抽象类(因为披萨的方法有不同的实现,也有相同的部分)来实现更好的扩展,然后再让一个PizzaShop依赖所有不同种类的披萨,因此我们首先要定义一个Pizza基类(抽象类):

package factory.simpleFactory.pizzas;

  
    public abstract class Pizza {
    
        private String name;
    
        public abstract void prepare();
    
        public void bake(){
            System.out.println("正在做"+name+"披萨");
        }
    
        public void cut(){
            System.out.println("正在切"+name+"披萨");
        }
    
        public void box(){
            System.out.println("正在包装"+name+"披萨");
        }
    
        public void setName(String name){
            this.name = name;
        }
    }

之后我们可以让子类继承该基类来实现扩展,例如牛肉披萨类:

public class BeefPizza extends Pizza {


    @Override
    public void prepare() {
        System.out.println("给牛肉披萨准备原材料");
    }
}

当然,也可以派生出苹果披萨,猪肉披萨等,每当披萨店有新品上市,理论上我们都只需要继承Pizza再实现扩展即可。
    之后我们便可以在PizzaShop中来卖披萨了。

public class PizzaShop1 {

    public PizzaShop1(){
        Pizza pizza = null;

        do{
            String pizzaType = getType();
            if(pizzaType.equals("beef")){
                pizza = new BeefPizza();
                pizza.setName("牛肉比萨");
            }else if(pizzaType.equals("apple")){
                pizza = new ApplePizza();
                pizza.setName("苹果比萨");
            }else {
                System.out.println("对不起,没有该类披萨");
                break;
            }
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }while (true);
    }

    public String getType(){
        try {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("请输入您想要点的披萨品种");
            String pizzaName = bufferedReader.readLine();
            return pizzaName;
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }
}

之后便再main方法中运行一下,可以看到:

public class OrderPizza {

    public static void main(String[] args) {
        new PizzaShop1();
        System.out.println("点餐结束");
    }
}

在这里插入图片描述
看似功能很完善,然而我们这里却有个大问题,我们知道披萨店往往都有分店,而所有不同的分店都要依赖Pizza,而每个PizzaShop的构造方法中都在做实例化对象的事情,因此我们一旦要新增一个Pizza品种,就要去修改每一个PizzaShop的构造方法,这样显然是违背了ocp法则的,故而我们应当想办法去客服这个问题,这时候简单工厂模式就有其用武之地了,它的大体思想就是我们只需要封装一个创建Pizza对象的类,这样当我们有新的Pizza类的时候只需要修改该类即可。简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无须知道其创建细节。

public class SimpleFactory {


    public Pizza createPizza(String pizzaType){
            Pizza pizza = null;
            if (pizzaType.equals("beef")) {
                pizza = new BeefPizza();
                pizza.setName("牛肉比萨");
            } else if (pizzaType.equals("apple")) {
                pizza = new ApplePizza();
                pizza.setName("苹果比萨");
            }

            return pizza;
    }
}

修改商品类

public class PizzaShop1 {



    public PizzaShop1(){
        do{
            Pizza pizza = null;
            String pizzaType = getType();
            if (pizzaType.equals("beef")) {
                pizza = new BeefPizza();
                pizza.setName("牛肉比萨");
            } else if (pizzaType.equals("apple")) {
                pizza = new ApplePizza();
                pizza.setName("苹果比萨");
            } else {
                System.out.println("对不起,没有该类披萨");
                break;
            }
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }while (true);
    }

    private SimpleFactory simpleFactory;
    Pizza pizza = null;
    public PizzaShop1(SimpleFactory simpleFactory){
        this.simpleFactory = simpleFactory;
        String orderType = "";//用户的输入
        do{
            orderType = getType();
            pizza=this.simpleFactory.createPizza(orderType);
            if(pizza!=null){
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
            }else {
                System.out.println("订购失败");
                break;
            }
        }while (true);
    }




    public String getType(){
        try {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("请输入您想要点的披萨品种");
            String pizzaName = bufferedReader.readLine();
            return pizzaName;
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }
}

这就是一个简单工厂类,其UML图如下。
在这里插入图片描述

发布了37 篇原创文章 · 获赞 10 · 访问量 756

猜你喜欢

转载自blog.csdn.net/weixin_41746577/article/details/98477889
今日推荐