貼代碼是為了方便以後查閱,沒有想教人的想法,因為這代碼是我看完 Abstract Factory模式後睡了一晚上第二天理解出來的。如果有什麼不對的地方還請指教,拜託了。
/*先宏觀的理解下面這句話後再看代碼:
*
* 提供一個介面,讓該介面負責建立一系列“相關或者相互依賴的對象”,無需指定它們具體的類。
——《設計模式》GoF
*/
/************ 門,窗的抽象類別 *************/
public abstract class Door
{
public abstract void DoorStyle();//抽象方法,使衍生類別能夠自由實現所需類型的門
}
public abstract class Window
{
public abstract void WindowStyle();//抽象方法,使衍生類別能夠自由實現所需類型的窗
}
/************ 不同類型的門,窗的實作類別 *************/
public class WoodDoor : Door //木門
{
public override void DoorStyle()
{
Console.WriteLine("使用木門");
}
}
public class StoneDoor : Door //石門
{
public override void DoorStyle()
{
Console.WriteLine("使用石門");
}
}
public class WoodWindow : Window //木窗
{
public override void WindowStyle()
{
Console.WriteLine("使用木窗");
}
}
public class StoneWindow : Window //石窗
{
public override void WindowStyle()
{
Console.WriteLine("使用石窗");
}
}
/***************** 建立工廠 ********************/
//這個工廠裡面都是建立屋子需要的材料,在這個程式中是門和窗
public abstract class AbstractFactory
{
public abstract Door GetDoor(); //抽象方法,使衍生類別能夠自由實現所需類型的門
public abstract Window GetWindow();//抽象方法,使衍生類別能夠自由實現所需類型的窗
}
/******** 建立實現不同類型房屋的工廠 *********/
public class BadHouseFactory:AbstractFactory //生產壞屋的工廠
{
public override Door GetDoor()
{
return new WoodDoor();
}
public override Window GetWindow()
{
return new WoodWindow();
}
}
public class GoodHouseFactory : AbstractFactory //生產好屋的工廠
{
public override Door GetDoor()
{
return new StoneDoor();
}
public override Window GetWindow()
{
return new StoneWindow();
}
}
/******** Client Application *********/
public class ClientClass
{
//生產房屋所需要的對象(這個程式裡假設只有門和窗)
private Door door; //門(沒說明是木門還是石門)
private Window window; //窗(沒說明是木窗還是石窗)
//是什麼類型的門窗由傳入的哪個工廠來決定
public ClientClass(AbstractFactory af)
{
door = af.GetDoor();
window = af.GetWindow();
}
public void MakeHouse()
{
door.DoorStyle();
window.WindowStyle();
}
public static void Main()
{
Console.WriteLine("生產劣質房屋:");
ClientClass t1 = new ClientClass(new BadHouseFactory());
t1.MakeHouse();
Console.WriteLine("/n----------------------/n");
Console.WriteLine("生產優質房屋:");
ClientClass t2 = new ClientClass(new GoodHouseFactory());
t2.MakeHouse();
Console.Read();
}
}
/* 代碼說明:
* 這個Demo的背景是一個建築公司,這個建築公司目前可以建築兩種類型的房屋(BadHouse and GoodHouse),在這裡假設建築房子只需要門和窗,
* 也就是說建築房屋需要的材料現在是恒定不變了,只有門和窗。
* 那什麼是變化的呢?比如說現在公司升級了,還可以建築一般的混合房屋(NormalHouse)了(木門+石窗 or 石門+木窗),就是說建築的房子的類型是變化的。
*
* 建築房子所需要的材料:門,窗。(這個是恒定不變的)
* 建築房子的類型:BadHouse,GoodHouse,NormalHouse。(這個是變化的)
*
* 這時候就可以增加3個類來實現建築NormalHouse了:NormalDoor(繼承自Door),NormalWindow(繼承自Window),NormalHouseFactory(繼承自AbstractFactory),
* 然後分別實現這3個類,現在建築公司就可以建築3種類型的房子了。
*
*
* OK,再來理解一下這句話:
* 提供一個介面,讓該介面負責建立一系列“相關或者相互依賴的對象”,無需指定它們具體的類。
——《設計模式》GoF
* 提供一個介面:
* 在程式中是AbstractFactory類,當然可以把它寫成介面,在這裡我寫成了類。
*
* 讓該介面負責建立一系列“相關或者相互依賴的對象”:
* 建築房子需要什嗎?需要門和窗,門和窗就是依賴的的對象。不可能建築一個房子只需要門而不需要窗。
*
* 無需指定它們具體的類:
* 具體的類在這裡指的是:WoodDoor,StoneDoor,WoodWindow和StoneWindow。在建築房子的時候當然不需要指定這些具體的類了。
* 為什嗎?因為有BadHouseFactory和GoodHouseFactory這兩個工廠幫我們去和它們打交道了。
*
* 注意:門和窗是建築房屋的恒定材料,如何改天建築房子需要門,窗,磚了,過段時間又需要門,窗,磚,水泥了。如果是這樣就不適合用
* Abstract Factory模式了。
*
*/