简单工厂模式
问题引出:假如有一个披萨店,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();
}
}