簡單工廠、工廠方法和抽象工廠模式
假想場景:hp和apple是全球知名的電腦生產廠家,他們各自的電腦
作業系統分別是windows和macintosh,microsoft是軟體行業的龍頭
。為了吸引更多客戶購買電腦,hp和apple請ms為他們開發兩款最常
用的軟體,辦公軟體和及時通訊工具。ms結了訂單後,分別為hp和
apple開發了office和msn。
上面的場景其實蘊含著我們常見的設計模式思維方式,code is
cheap,程式碼來了。
一:簡單工廠
Code
using System;
//ms的產品
public class Software
{
private string softwareName;
public virtual string SoftwareName
{
get { return softwareName; }
set { softwareName = value; }
}
public string GetSoftwareName()
{
return softwareName;
}
}
//ms的產品:office
public class Office:Software
{
public override string GetSoftwareName()
{
this.SoftwareName = "Office";
return “Office”;
}
}
//ms的產品:msn
public class Msn : Software
{
public override string GetSoftwareName()
{
this.SoftwareName = "Msn";
return “Msn”;
}
}
///
/// 簡單工廠
///
public class MsSoftwareFactory
{
public static Software CreateSoftware(string
softwareName)
{
Software msSoftware = null;
switch (softwareName)
{
default:
break;
case "office":
msSoftware = new Office();
break;
case "msn":
msSoftware = new Msn();
break;
}
return msSoftware;
}
}
///
/// 客戶端呼叫
///
public class Client {
static void Main(string[] args)
{
Software msSoftware =
MsSoftwareFactory.CreateSoftware("office");
Console.WriteLine(msSoftware.GetSoftwareName());
}
}
上面的簡單工廠在一個方法體中有個switch...case,違背了“對擴
展開放,對修改封閉”的原則,即“開放-封閉原則”。下面的工廠
方法就克服了簡單工廠的缺點,降低了客戶端程式和產品物件的耦
合。
二:工廠方法
定義一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠
方法使一個類的例項化延遲到其子類。
Code
using System;
//ms的產品
public class Software
{
private string softwareName;
public string SoftwareName
{
get { return softwareName; }
set { softwareName = value; }
}
public virtual string GetSoftwareName()
{
return softwareName;
}
}
//ms的產品:office
public class Office:Software
{
public override string GetSoftwareName()
{
this.SoftwareName = "Office";
return "Office";
}
}
//ms的產品:msn
public class Msn : Software
{
public override string GetSoftwareName()
{
this.SoftwareName = "Msn";
return "Msn";
}
}
interface ISoftwareFactory
{
Software CreateSoftware();
}
///
/// office工廠
///
public class OfficeFactory:ISoftwareFactory
{
public Software CreateSoftware()
{
return new Office();
}
}
///
/// msn工廠
///
public class MsnFactory : ISoftwareFactory
{
public Software CreateSoftware()
{
return new Msn();
}
}
///
/// 客戶端呼叫
///
public class Client {
static void Main(string[] args)
{
ISoftwareFactory factory = new OfficeFactory();
Software msSoftware = factory.CreateSoftware();
Console.WriteLine(msSoftware.GetSoftwareName());
}
}工廠方法的缺點是每加一個產品,就要建立一個對應的產品工廠類
,增加了額外的開發量。
三、抽象工廠
提供一個建立一系列相關或者相互依賴物件的介面,而無需指定它
們具體的類。
抽象工廠最經典的應用莫過於資料庫訪問程式。網上有很多這方面
的討論。不多說了。這裡我繼續用開篇講的場景來描述。
我們知道office和msn根據作業系統的不同可以分為windows版本的
和mac版本的,也許還有linux,unix版本的,歸根結底,這裡的產
品涉及到產品系列的問題,抽象工廠可以解決這個問題:
Code
using System;
//ms的產品:office
public class Office
{
private string softwareName;
public string SoftwareName
{
get { return softwareName; }
set { softwareName = value; }
}
}
public interface IOffice
{
Office GetOffice();
}
//ms的windows版本Office
public class WinOffice : IOffice
{
public Office GetOffice()
{
return new Office();
}
}
//ms的macintosh版本Office
public class MacOffice : IOffice
{
public Office GetOffice()
{
return new Office();
}
}
//ms的產品:msn
public class Msn
{
private string softwareName;
public string SoftwareName
{
get { return softwareName; }
set { softwareName = value; }
}
}
public interface IMsn
{
Msn GetMsn();
}
//ms的windows版本msn
public class WinMsn:IMsn
{
public Msn GetMsn()
{
return new Msn();
}
}
//ms的macintosh版本msn
public class MacMsn : IMsn
{
public Msn GetMsn()
{
return new Msn();
}
}
interface ISoftwareFactory
{
IOffice CreateOffice();
IMsn CreateMsn();
}
///
/// windows版本的工廠
///
public class WindowsFactory:ISoftwareFactory
{
public IOffice CreateOffice()
{
return new WinOffice();
}
public IMsn CreateMsn()
{
return new WinMsn();
}
}
///
/// macintosh版本的工廠
///
public class MacFactory : ISoftwareFactory
{
public IOffice CreateOffice()
{
return new MacOffice();
}
public IMsn CreateMsn()
{
return new MacMsn();
}
}
///
/// 客戶端呼叫
///
public class Client {
static void Main(string[] args)
{
ISoftwareFactory factory = new WindowsFactory();
IOffice ffice = factory.CreateOffice();
IMsn msn = factory.CreateMsn();
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-567489/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 簡單工廠,工廠方法和抽象工廠抽象
- 簡單工廠模式和抽象工廠模式模式抽象
- 設計模式-簡單工廠、工廠方法模式、抽象工廠模式設計模式抽象
- 一篇搞定工廠模式【簡單工廠、工廠方法模式、抽象工廠模式】模式抽象
- Java設計模式之簡單工廠、工廠方法和抽象工廠Java設計模式抽象
- 簡單工廠模式、工廠方法模式和抽象工廠模式有何區別?模式抽象
- 設計模式之工廠模式!深入解析簡單工廠模式,工廠方法模式和抽象工廠模式設計模式抽象
- 簡單工廠模式、工廠模式、抽象工廠模式比較模式抽象
- 簡單工廠 VS 工廠方法 VS 抽象工廠抽象
- 簡單工廠和工廠方法模式模式
- 簡單工廠,工廠方法和抽象工廠模式(我也湊湊熱鬧)抽象模式
- 建立型:工廠模式-工廠方法、抽象工廠模式抽象
- 無廢話設計模式(1)--簡單工廠、工廠方法、抽象工廠設計模式抽象
- 簡單工廠和工廠模式模式
- C# 設計模式(1)——簡單工廠模式、工廠模式、抽象工廠模式C#設計模式抽象
- 簡單工廠模式—>工廠模式模式
- 簡單工廠和抽象工廠的區別抽象
- 抽象工廠模式-與-工廠方法模式區別抽象模式
- 工廠模式之簡單工廠模式模式
- 設計模式之工廠方法模式|抽象工廠模式設計模式抽象
- 工廠方法模式與抽象工廠模式的區別模式抽象
- 建立型:工廠模式-簡單工廠模式
- 工廠模式(簡單工廠模式)快速理解模式
- 設計模式學習筆記(三)簡單工廠、工廠方法和抽象工廠之間的區別設計模式筆記抽象
- Python 實現工廠模式、抽象工廠,單例模式Python模式抽象單例
- 抽象工廠模式抽象模式
- 簡單工廠、工廠模式初學習模式
- Java 設計模式之工廠方法模式與抽象工廠模式Java設計模式抽象
- 工廠三兄弟之抽象工廠模式(二)抽象模式
- 工廠三兄弟之抽象工廠模式(一)抽象模式
- 工廠模式 抽象模式模式抽象
- 請教banq 抽象工廠模式怎樣和工廠方法模式配合使用抽象模式
- 工廠三兄弟之簡單工廠模式(三)模式
- 工廠三兄弟之簡單工廠模式(二)模式
- 工廠三兄弟之簡單工廠模式(一)模式
- 簡單工廠模式模式
- 工廠模式和抽象工廠的區別是什麼?模式抽象
- 【Java】簡單工廠模式、工廠模式、介面卡模式Java模式