工厂模式:通过让子类决定该穿件的对象是什么,来达到将对象创建的过程封装的目的。
//抽象的产品
//工厂所生产的产品"披萨"
public abstract class Pizza
{
protected string name;
//产品生产工序
public virtual void prepare()
{
Console.WriteLine("准备“{0}”的馅料", name);
}
public virtual void bake()
{
Console.WriteLine("350度分钟烤25分钟 ");
}
public virtual void cut()
{
Console.WriteLine("将比萨饼切成斜片");
}
public virtual void box()
{
Console.WriteLine("将披萨装入地方特色的盒子中");
}
public string getName()
{
return name;
}
}
//具体的产品
public class ChicagoStyleCheesePizza:Pizza
{
public ChicagoStyleCheesePizza()
{
base.name = "芝加哥起司披萨";
}
}
public class NYStyleCheesePizza : Pizza
{
public NYStyleCheesePizza()
{
base.name = "纽约起司披萨";
}
}
//抽象的工厂
//抽象的披萨工厂
public abstract class PizzaStore
{
public Pizza orderPizza(string type)
{
Pizza pizza;
pizza = createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
//创建披萨的抽象方法,在子类中实现
public abstract Pizza createPizza(string item);
}
//具体的工厂
//芝加哥工厂
public class ChicagoStore:PizzaStore
{
public override Pizza createPizza(string item)
{
if (item.ToUpper().Equals("CHEESE"))
{
return new ChicagoStyleCheesePizza();
}
else
{
return null;
}
}
}
//纽约工厂
public class NYPizzaStore:PizzaStore
{
public override Pizza createPizza(string item)
{
if (item.ToUpper().Equals("CHEESE"))
{
return new NYStyleCheesePizza();
}
else
{
return null;
}
}
}
//测试用例
class Program
{
static void Main(string[] args)
{
PizzaStore pizzaStore;
List<PizzaStore> pizzaStoreList = new List<PizzaStore>();
pizzaStoreList.Add(new NYPizzaStore());
pizzaStoreList.Add(new ChicagoStore());
while (true)
{
Console.WriteLine("请选择披萨商店:");
for (int i = 0; i < pizzaStoreList.Count; i++)
{
Console.WriteLine("{0}:{1}", i + 1, pizzaStoreList[i].GetType().Name);
}
if (!selectStore(pizzaStoreList, out pizzaStore))
{
continue;
}
Console.WriteLine("请选择披萨口味:");
Pizza pizza = selectPizza(pizzaStore);
Console.WriteLine("您成功订购了披萨:{0}", pizza.getName());
Console.Write("输入1继续订购,其他则退出,回车确认:");
if (Console.ReadLine().Equals("1"))
{
continue;
}
else
{
break;
}
}
}
Pizza selectPizza(PizzaStore pizzaStore)
{
while (true)
{
Console.WriteLine("1:Cheese");
Console.Write("请输入编号,按回车键确认:");
string pizzaNum = Console.ReadLine();
if (pizzaNum.Equals("1"))
{
return pizzaStore.orderPizza("Cheese");
}
else
{
Console.WriteLine("输入有误,请重新输入编号!");
}
}
}
bool selectStore(List<PizzaStore> pizzaStoreList, out PizzaStore pizzaStore)
{
pizzaStore = null;
int num = 0;
while (true)
{
Console.Write("请输入编号,按回车键确认,输入0回到商店选择:");
try
{
num = Convert.ToInt32(Console.ReadLine());
if (num == 0)
{
return false;
}
pizzaStore = pizzaStoreList[num - 1];
return true;
}
catch (Exception e)
{
Console.WriteLine("请输入编号有误,错误原因({0})", e.Message);
}
}
}
}
测试结果:
延展:
依赖倒置原则:要依赖抽象,不要依赖具体类。
这个原则听起来很像是“针对接口编程,不针对实现编程”,然后这里更强调“抽象”。这个原则说明了:不能让高层组件依赖低层组件,而且,不管高层或低层组件,“两者”都应该依赖于抽象。