關于工廠模式和單例模式 大部分項目這2種模式都很常見
例如在orm架構中 工廠模式常用來封裝資料庫的建立 我們分3種case來看 簡單工廠模式 普通工廠模式 抽象工廠模式
抽象一點的說 工廠模式提供一個建立一系列相關或互相依賴對象的接口,而無需指定它們具體的類。直接看執行個體
一般慣性思維 我們遇到分支判斷時會這樣
public class NormalCase
{
private DBInstance dbInstance;
public NormalCase(string type)
{
if (type.Equals("SQL"))
{
dbInstance= new SqlInstance();
}
else if (type.Equals("Oracle"))
dbInstance = new OracleInstance();
else if (type.Equals("Mysql"))
dbInstance = new MysqlInstance();
}
public void ExecuteNonQuery()
this.dbInstance.ExecuteNonQuery();
public void ExecuteDataset()
this.dbInstance.ExecuteDataset();
}
那麼 new有什麼不好,在技術上new沒什麼錯,但是好的設計針對擴充開放而對修改關閉。
針對接口程式設計,可以隔離掉以後系統可能發生的一大堆改變。如果代碼是針對接口編寫,那麼通過多态,它可以與任何新類實作該接口。
下面讓我們看看工廠模式如何解決該問題
先來看看簡單工廠
public class SimpleFactory
public DBInstance createinstance(string type)
DBInstance di = null;
if (type.Equals("SQL"))
return new SqlInstance();
return new OracleInstance();
return new MysqlInstance();
return di;
public class SimpleCase
SimpleFactory facotory;
DBInstance di;
public SimpleCase(SimpleFactory facotory)
this.facotory = facotory;
public DBInstance CreateInstance(string type)
{
di = facotory.createinstance(type);
return di;
this.di.ExecuteNonQuery();
this.di.ExecuteDataset();
準确來說,簡單工廠并不是一種設計模式,反而比較像是一種程式設計習慣。上述case隻是把問題從一個對象搬到另一個對象中,問題依然存在。但是SimpleFactory可以有許多客戶,把建立執行個體的代碼包裝進一個類,當以後實作改變時,隻需修改這個類就可以了。物品們也正要把具體執行個體化的過程從客戶的代碼中删除。
下面我就來介紹下兩個重量級的模式!
工廠方法模式
public abstract class facotoryCase
{
di = create(type);
public abstract DBInstance create(string type);
public void ExecuteNonQuery()
{
this.di.ExecuteNonQuery();
}
public void ExecuteDataset()
this.di.ExecuteDataset();
public class facotoryCaseA : facotoryCase
public override DBInstance create(string type)
return null;
public class facotoryCaseB : facotoryCase
if (type.Equals("Mysql"))
}
工廠方法模式定義了一個建立對象的接口,但由子類決定要執行個體化的類是哪一個。工廠方法讓類把執行個體化推遲到子類。
設計原則:要依賴抽象不要依賴具體類。
接下來再看下抽象工廠模式
public class Param { }
public class sqlparm : Param { }
public class oracleparam : Param { }
public class connection { }
public class sqlconnecttion : connection { }
public class oracleconnecttion : connection { }
public interface abstractCase
Param GetParameter();
connection GetConnection();
public abstract class DBInstanceforabstract
public Param p;
public connection c;
public abstract void ExecuteNonQuery();
public abstract void ExecuteDataset();
public class DBInstanceforabstractA : DBInstanceforabstract
abstractCase ac;
public DBInstanceforabstractA(abstractCase ac)
this.ac = ac;
public override void ExecuteNonQuery()
p = ac.GetParameter();
public override void ExecuteDataset()
c = ac.GetConnection();
public class abstractCaseA : abstractCase
DBInstanceforabstract di;
public Param GetParameter()
return new sqlparm();
public connection GetConnection()
return new sqlconnecttion();
public class abstractCaseB : abstractCase
return new oracleparam();
return new oracleconnecttion();
抽象工廠模式提供一個接口,用于建立相關或依賴對象的家族而不需要明确指定具體類。
本文轉自 熬夜的蟲子 51CTO部落格,原文連結:http://blog.51cto.com/dubing/712407