原型模式(Prototype Pattern)
背景介绍:
小胖子发现有些顾客对特定口味的披萨特别感兴趣,而且他们常常会要求披萨的配料、大小等细节完全相同。为了满足这一需求,小胖子决定引入原型模式,通过复制现有披萨的原型来创建新的披萨对象。
设计模式应用:
原型模式
为了方便复制现有披萨的细节,小胖子引入了原型模式。他创建了一个披萨原型管理器,其中包含了各种口味的披萨原型。当顾客需要相同口味的披萨时,可以从原型管理器中复制相应的原型,从而快速创建新的披萨对象。
代码示例:
import java.util.HashMap;
import java.util.Map;
// 披萨原型接口
interface PizzaPrototype {
PizzaPrototype clone();
}
// 具体披萨原型类
class ConcretePizzaPrototype implements PizzaPrototype {
private String flavor;
private String size;
private String toppings;
public ConcretePizzaPrototype(String flavor, String size, String toppings) {
this.flavor = flavor;
this.size = size;
this.toppings = toppings;
}
@Override
public PizzaPrototype clone() {
// 实现披萨原型的复制
return new ConcretePizzaPrototype(this.flavor, this.size, this.toppings);
}
@Override
public String toString() {
return "ConcretePizzaPrototype{" +
"flavor='" + flavor + '\'' +
", size='" + size + '\'' +
", toppings='" + toppings + '\'' +
'}';
}
}
// 披萨原型管理器
class PizzaPrototypeManager {
private Map<String, PizzaPrototype> prototypes = new HashMap<>();
// 添加披萨原型
public void addPrototype(String key, PizzaPrototype prototype) {
prototypes.put(key, prototype);
}
// 获取披萨原型
public PizzaPrototype getPrototype(String key) {
return prototypes.get(key).clone();
}
}
// 客户端
public class PrototypePatternExample {
public static void main(String[] args) {
// 创建披萨原型管理器
PizzaPrototypeManager prototypeManager = new PizzaPrototypeManager();
// 添加不同口味的披萨原型
prototypeManager.addPrototype("Margherita", new ConcretePizzaPrototype("Margherita", "Medium", "Tomato, Mozzarella"));
prototypeManager.addPrototype("Pepperoni", new ConcretePizzaPrototype("Pepperoni", "Large", "Tomato, Pepperoni, Cheese"));
// 顾客需要一份Margherita口味的披萨
PizzaPrototype margheritaPizza = prototypeManager.getPrototype("Margherita");
System.out.println("顾客1的披萨:" + margheritaPizza);
// 顾客需要一份Pepperoni口味的披萨
PizzaPrototype pepperoniPizza = prototypeManager.getPrototype("Pepperoni");
System.out.println("顾客2的披萨:" + pepperoniPizza);
}
}
通过原型模式解决的问题
通过引入原型模式,小胖子成功解决了以下问题:
- 快速创建相似对象: 原型模式允许小胖子通过复制披萨的原型,快速创建新的披萨对象,减少了对象的创建时间和资源消耗。
- 维护披萨细节一致性: 顾客可以根据已有口味的披萨原型创建新的披萨对象,确保了披萨的配料、大小等细节的一致性,满足了一些特定口味的顾客需求。
- 降低内存占用: 通过共享相同口味的披萨原型,减少了相似对象的创建开销,降低了内存占用,提高了系统的性