工厂方法示例
工厂方法
定义一个创建对象的接口,由子类决定哪个对象被实例化。
示例:
- 抽象类PizzaStore,包含方法OrderPizza,抽象方法CreatePizza,
CreatePizza返回IPizza - PizzaStore的子类NYPizzaStore,ChicagoStore,实现CreatePizza方法
- IPizza接口,包含Bake,Prepare,Cut,Box方法
纽约披萨:NYCheesePizza,NYVeggiePizza,
芝加哥披萨:ChicagoCheesePizza,ChicagoCheesePizza - 抽象类PizzaStore的OrderPizza方法使用CreatePizza方法制作披萨;
CreatePizza是工厂方法,它用于创建对象,当其他类继承PizzaStore类时,必须实现CreatePizza方法,从而自定义实例化哪些对象。
优点
添加其他地区的披萨产品,不需要修改PizzaStore,只需要添加新的子类即可。
披萨店 披萨
CreatePizza方法是一个工厂方法
抽象方法CreatePizza决定创建哪个披萨实例
public abstract class PizzaStore
{
public void OrderPizza(string pizzaType)
{
IPizza pizza = CreatePizza(pizzaType);
pizza.Prepare();
pizza.Bake();
pizza.Cut();
pizza.Box();
}
protected abstract IPizza CreatePizza(string pizzaType);
}
纽约披萨店 芝加哥披萨店
public class NYPizzaStore : PizzaStore
{
protected override IPizza CreatePizza(string pizzaType)
{
IPizza pizza = null;
if (pizzaType == "Cheese")
{
pizza = new NYCheesePizza();
}
else if (pizzaType == "Veggie")
{
pizza = new NYVeggiePizza();
}
return pizza;
}
}
public class ChicagoPizzaStore : PizzaStore
{
protected override IPizza CreatePizza(string pizzaType)
{
IPizza pizza = null;
if (pizzaType == "Cheese")
{
pizza = new ChicagoCheesePizza();
}
else if (pizzaType == "Veggie")
{
pizza = new ChicagoVeggiePizza();
}
return pizza;
}
}
披萨
public interface IPizza
{
void Prepare();
void Bake();
void Cut();
void Box();
}
纽约披萨
public class NYCheesePizza : IPizza
{
public void Bake()
{
Console.WriteLine("纽约烘焙Cheese");
}
public void Box()
{
Console.WriteLine("纽约包装Cheese");
}
public void Cut()
{
Console.WriteLine("纽约分开Cheese");
}
public void Prepare()
{
Console.WriteLine("纽约准备Cheese");
}
}
public class NYVeggiePizza : IPizza
{
public void Bake()
{
Console.WriteLine("纽约烘焙Veggie");
}
public void Box()
{
Console.WriteLine("纽约包装Veggie");
}
public void Cut()
{
Console.WriteLine("纽约分开Veggie");
}
public void Prepare()
{
Console.WriteLine("纽约准备Veggie");
}
}
芝加哥披萨
public class ChicagoCheesePizza : IPizza
{
public void Bake()
{
Console.WriteLine("芝加哥烘焙Cheese");
}
public void Box()
{
Console.WriteLine("芝加哥包装Cheese");
}
public void Cut()
{
Console.WriteLine("芝加哥分开Cheese");
}
public void Prepare()
{
Console.WriteLine("芝加哥准备Cheese");
}
}
public class ChicagoVeggiePizza : IPizza
{
public void Bake()
{
Console.WriteLine("芝加哥烘焙Veggie");
}
public void Box()
{
Console.WriteLine("芝加哥包装Veggie");
}
public void Cut()
{
Console.WriteLine("芝加哥分开Veggie");
}
public void Prepare()
{
Console.WriteLine("芝加哥准备Veggie");
}
}
使用
PizzaStore nyPizzaStore=new NYPizzaStore();
PizzaStore chicagoStore=new ChicagoPizzaStore();
nyPizzaStore.OrderPizza("Veggie");
nyPizzaStore.OrderPizza("Cheese");
chicagoStore.OrderPizza("Veggie");
chicagoStore.OrderPizza("Cheese");