原创

设计模式之简单工厂模式

基本介绍:

1)简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式

2)简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)

3)在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式

4)改进的思路分析

分析:修改代码可以接受,但是如果我们在其他的地方也有创建Pizza的代码,就意味着,也需要修改,而创建Pizza的代码,往往有多处。

思路:把创建Pizza对象封装到一个类中,这样我们有新的Pizza种类时,只需要修改该类即可,其它有创建到Pizza对象的代码就不需要修改了.->简单工厂模式

Pizza订购的类图


代码结构如下:


这里涉及到了5个类型,我这里分别贴出源代码

Pizza类,具体pizza的父类

package factory.simplefactory.pizzastore;

public abstract class Pizza {

    protected String name;

    abstract void prepare();

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

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

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

GreekPizza希腊Pizza

package factory.simplefactory.pizzastore;

public class GreekPizza extends Pizza {
    @Override
    void prepare() {
        setName("GreekPizza");
        System.err.println(name + "preparing;");
    }
}

奶酪Pizza

package factory.simplefactory.pizzastore;

public class CheessPizza extends Pizza {
    @Override
    void prepare() {
        setName("奶酪Pizza");
        System.err.println(name + "preparing;");
    }

}

简单工厂类

package factory.simplefactory.pizzastore;

//简单工厂类
public class SimpleFactory {

    //根据orderType返回对应的Pizza对象
    public Pizza createPizza(String orderType){
        Pizza pizza = null;
        System.err.println("使用简单工厂模式");
        if(orderType.equals("greek")){
            pizza = new GreekPizza();
        }else if(orderType.equals("cheese")){
            pizza = new CheessPizza();
        }
        return pizza;
    }
}

下单Pizza类

package factory.simplefactory.pizzastore;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class OrderPizza {

    //定义一个简单工厂对象
    SimpleFactory s;

    Pizza pizza = null;

    //构造器
    public OrderPizza(SimpleFactory simpleFactory){
        setS(simpleFactory);
    }

    public void setS(SimpleFactory s) {
        String orderType = "";//用户输入的
        this.s = s;

        do{
            orderType = getType();
            Pizza pizza = s.createPizza(orderType);
            if(pizza != null) {
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
            }else{
                System.err.println("订购pizza失败,没有这种pizza!");
            }
        }while (true);
    }

    private String getType(){
        try{
            BufferedReader string = new BufferedReader(new InputStreamReader(System.in));
            System.err.println("input pizza type:");
            String str = string.readLine();
            return str;
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }
}

测试类

package factory.simplefactory.pizzastore;

public class Main {
    public static void main(String[] args) {
        new OrderPizza(new SimpleFactory());
    }
}

这样子,一旦有新的Pizza品种,只需要修改简单工厂类SimpleFactory即可。


补充:

简单工厂模式,也叫静态工厂模式

一般来说,简单工厂模式的create方法一般是使用静态方法


需要对上面的修改2个文件

SimpleFactory 和 OrderPizza

如下:

package factory.simplefactory.pizzastore;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class OrderPizza {


    Pizza pizza = null;

    //构造器
    public OrderPizza(){
        setS();
    }

    public void setS() {
        String orderType = "";//用户输入的
        do{
            orderType = getType();
            Pizza pizza = SimpleFactory.createPizza(orderType);
            if(pizza != null) {
                pizza.prepare();
                pizza.bake();
                pizza.cut();
                pizza.box();
            }else{
                System.err.println("订购pizza失败,没有这种pizza!");
            }
        }while (true);
    }

    private String getType(){
        try{
            BufferedReader string = new BufferedReader(new InputStreamReader(System.in));
            System.err.println("input pizza type:");
            String str = string.readLine();
            return str;
        } catch (IOException e) {
            e.printStackTrace();
            return "";
        }
    }
}

package factory.simplefactory.pizzastore;

//简单工厂类
public class SimpleFactory {

    //根据orderType返回对应的Pizza对象
    public static Pizza createPizza(String orderType){
        Pizza pizza = null;
        System.err.println("使用简单工厂模式");
        if(orderType.equals("greek")){
            pizza = new GreekPizza();
        }else if(orderType.equals("cheese")){
            pizza = new CheessPizza();
        }
        return pizza;
    }
}


正文到此结束
本文目录