定義一個用於建立對象的接口,讓子類決定實例化哪個類。Factory Method使得一個類的實例化延遲到子類(即:工廠子類)。ide
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;spa
namespace 工廠模式
{
class Program
{
static void Main(string[] args)
{
Factory factory = null;
Product product = null;
while (true)
{
Console.WriteLine("你想生產Car請按1鍵,想生產AirPlane請按2鍵,想生產Tank請按3鍵");
int num = int.Parse(Console.ReadLine());
switch (num)
{
case 1: factory = new FactoryCar(); product = factory.produc(); break;
case 2: factory = new FactoryAirPlane(); product = factory.produc(); break;
case 3: factory = new FactoryTank(); product = factory.produc(); break;代理
default: Console.WriteLine("請按1~3鍵"); break;對象
}
}
接口
Console.ReadLine();string
}產品
public static void print(string str)
{
Console.WriteLine(str);
}
}it
public abstract class Factory//工廠父類
{
public abstract Product produc();io
}class
public class FactoryCar : Factory//生產Car的工廠
{
public override Product produc()
{
Console.WriteLine("你生產了一輛車");
return new car();
}
}
public class FactoryAirPlane : Factory//生產Car的工廠
{
public override Product produc()
{
Console.WriteLine("你生產了一架飛機");
return new airplane();
}
}
public class FactoryTank : Factory//生產Tank的工廠
{
public override Product produc()
{
Console.WriteLine("你生產了一輛坦克");
return new Tank();
}
}
public abstract class Product//產品類
{
public abstract string production();//生產產品
}
public class car:Product//Car產品
{
public override string production()
{
return "car";
}
}
public class airplane:Product//飛機產品
{
public override string production()
{
return "airplane";
}
}
public class Tank : Product//坦克產品
{
public override string production()
{
return "tank";
}
}
}
Factory Method模式的兩種狀況:一是Creator類是一個抽象類且它不提供它所聲明的工廠方法的實現;二是Creator是一個具體的類且它提供一個工廠方法的缺省實現。
工廠方法是能夠帶參數的。
工廠的做用並不單單只是建立一個對象,它還能夠作對象的初始化,參數的設置等。
用工廠方法在一個類的內部建立對象一般比直接建立對象更靈活。
Factory Method模式經過面向對象的手法,將所要建立的具體對象的建立工做延遲到了子類,從而提供了一種擴展的策略,較好的解決了這種緊耦合的關係。
在如下狀況下,適用於工廠方法模式: 1. 當一個類不知道它所必須建立的對象的類的時候。 2. 當一個類但願由它的子類來指定它所建立的對象的時候。 3. 當類將建立對象的職責委託給多個幫助子類中的某一個,而且你但願將哪個幫助子類是代理者這一信息局部化的時候。