设计模式的代码仓库:
设计模式
具体定义:
工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。
工厂方法让类把实例化推迟到子类。
优点:
用户并不知道什么具体产品类被实例化
当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体产品对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好地符合了“开闭原则”。
工厂自主决定创建什么对象
缺点:
复杂度
依赖倒置
public abstract class Pizza {
public String name;
public String dough;
public String sauce;
public ArrayList toppings = new ArrayList();
public void Prepare() {
System.out.println("Preparing" + name);
System.out.println("Tossingdough...");
System.out.println("Addingsauce..");
System.out.println("Addingtoppings: ");
for (int i = 0; i < toppings.size(); i++) {
System.out.println(" " + toppings.get(i));
}
}
public void Bake() {
System.out.println("Bakefor 25 minutes at 350");
}
public void Cut() {
System.out.println("Cuttingthe pizza into diagonal slices");
}
public void Box() {
System.out.println("Placepizza in official PizzaStore box");
}
public String GetName() {
return name;
}
}
public abstract class PizzaStore
{
public Pizza OrderPizza(String type)
{
Pizza pizza = CreatePizza(type);
pizza.Prepare();
pizza.Bake();
pizza.Cut();
pizza.Box();
return pizza;
}
//抽象出创建Pizza的工厂方法,由子类实现该方法并创建具体的Pizza
public abstract Pizza CreatePizza(String type);
}
public class MYPizzaStore extends PizzaStore {
@Override
public Pizza CreatePizza(String type) {
Pizza pizza = null;
switch (type) {
case "cheese":
pizza = new NYStyleCheesePizza();
break;
default:
break;
}
return pizza;
}
}
public class NYStyleCheesePizza extends Pizza {
public NYStyleCheesePizza() {
name = "NY StyleSauc and Cheese Pizza";
dough = "Thin Crust Dough";
sauce = "Marinara Sauce";
toppings.add("GratedReggiano Cheese");
}
}