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