Java中的简单工厂模式

简单工厂模式
问题引出:假如有一个披萨店,Pizza的种类有很多,如奶酪披萨、蔬菜披萨、水果披萨等。披萨店根据收到的订单制作Pizza,如何实现?
简单工厂模式是属于创建型模式,但不属于23种GOF设计模式之一,简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。
简单工厂模式中包含如下角色:
Factory:工厂角色,工厂角色负责实现创建所有实例的内部逻辑。
Product:抽象产品角色,抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口。
CreateProduct:具体产品角色,具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。
使用场景:
工厂类负责创建的对象比较少;
客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心。
代码实现:
package org.jayce.bean;
//披萨父类
public class Pizza {
    public Pizza() { super(); }
    /**
     * 带参数的构造方法
     * 
     * @param name   名字
     * @param size   尺寸
     * @param flavor 风味
     * @param price  价格
     */
    public Pizza(String name, int size, String flavor, int price) {
        super();
        this.name = name;
        this.size = size;
        this.flavor = flavor;
        this.price = price;
    }
    /**
     * 名称
     */
    protected String name;
    /**
     * 尺寸
     */
    protected int size;
    /**
     * 风味
     */
    protected String flavor;
    /**
     * 价格
     */
    protected int price;
    /**
     * 显示信息方法
     */
    public void show() {
        System.out.println("\n------------披萨信息介绍--------------\n");
        System.out.println("名称:" + this.name);
        System.out.println("尺寸:" + this.size + "寸");
        System.out.println("风味:" + this.flavor);
        System.out.println("价格:" + this.price + "元");
    }
    //setter、getter方法省略
}

package org.jayce.bean;
//水果披萨子类
public class FruitPizza extends Pizza {
    public FruitPizza() { super(); }
    /**
     * 带参数的构造方法
     * 
     * @param name      名称
     * @param size      尺寸
     * @param flavor    风味
     * @param price     价格
     * @param fruitName 水果种类
     */
    public FruitPizza(String name, int size, String flavor, int price, String fruitName) {
        super(name, size, flavor, price);
        this.fruitName = fruitName;
    }
    /**
     * 水果种类
     */
    private String fruitName;
    /**
     * 显示信息方法
     */
    @Override
    public void show() {
        super.show();
        System.out.println("水果种类:" + this.fruitName);
    }
     //setter、getter方法省略
}

package org.jayce.bean;
//蔬菜披萨
public class VegetablePizza extends Pizza {
    public VegetablePizza() { super(); }
    /**
     * 带参数构造
     * 
     * @param name          名称
     * @param size          尺寸
     * @param flavor        风味
     * @param price         价格
     * @param vegetableName 蔬菜种类
     * @param isCooked      蔬菜是否烹饪
     */
    public VegetablePizza(String name, int size, String flavor, int price, String vegetableName, boolean isCooked) {
        super(name, size, flavor, price);
        this.vegetableName = vegetableName;
        this.isCooked = isCooked;
    }
    /**
     * 蔬菜种类
     */
    private String vegetableName;
    /**
     * 蔬菜是否烹饪
     */
    private boolean isCooked;
    /**
     * 显示信息
     */
    @Override
    public void show() {
        super.show();
        System.out.println("蔬菜种类:" + this.vegetableName);
        System.out.println("是否烹饪:" + (this.isCooked ? "蔬菜已烹饪" : "新鲜蔬菜"));
    }
    //setter、getter方法省略
}

package org.jayce.bean;
//披萨的工厂类
public class PizzaFactory {
    /**
     * 生产产品的方法
     * 
     * @param name          名称
     * @param size          尺寸
     * @param flavor        风味
     * @param price         价格
     * @param fruitName     水果种类
     * @param vegetableName 蔬菜种类
     * @param isCooked      是否烹饪
     * @return 披萨父类对象
     */
    public static Pizza builder(String name, int size, String flavor, int price, String fruitName,
            String vegetableName, boolean isCooked) {
        if (fruitName != null) {
            return new FruitPizza(name, size, flavor, price, fruitName);
        } else if (vegetableName != null) {
            return new VegetablePizza(name, size, flavor, price, vegetableName,isCooked);
        }
        return null;
    }
}

//测试类
public class TestPizza {
    public static void main(String[] args) {
        Pizza pizza1=PizzaFactory.builder("榴莲披萨", 8, "香脆", 120, "榴莲", null, false);
        pizza1.show();
        Pizza pizza2=PizzaFactory.builder("胡萝卜披萨", 12, "软糯", 300, null, "胡萝卜", false);
        pizza2.show();
    }
}

你可能感兴趣的:(Java,java,简单工厂模式,开发语言)