結合項目實例 回顧傳統設計模式(四)工廠模式(簡單工廠、普通工廠、抽象工廠)
2011-10-04 13:19 熬夜的蟲子 閱讀(886) 評論(1) 收藏 舉報關于工廠模式和單例模式 大部分項目這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();
}
}
{
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();
}
else if (type.Equals("Oracle"))
{
return new OracleInstance();
}
else if (type.Equals("Mysql"))
{
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;
}
public void ExecuteNonQuery()
{
this.di.ExecuteNonQuery();
}
public void ExecuteDataset()
{
this.di.ExecuteDataset();
}
}
{
public DBInstance createinstance(string type)
{
DBInstance di = null;
if (type.Equals("SQL"))
{
return new SqlInstance();
}
else if (type.Equals("Oracle"))
{
return new OracleInstance();
}
else if (type.Equals("Mysql"))
{
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;
}
public void ExecuteNonQuery()
{
this.di.ExecuteNonQuery();
}
public void ExecuteDataset()
{
this.di.ExecuteDataset();
}
}
準確來說,簡單工廠并不是一種設計模式,反而比較像是一種編程習慣。上述case只是把問題從一個對象搬到另一個對象中,問題依然存在。但是SimpleFactory可以有許多客戶,把創建實例的代碼包裝進一個類,當以后實現改變時,只需修改這個類就可以了。物品們也正要把具體實例化的過程從客戶的代碼中刪除。
下面我就來介紹下兩個重量級的模式!
工廠方法模式
public abstract class facotoryCase
{
DBInstance di;
public DBInstance CreateInstance(string type)
{
di = create(type);
return di;
}
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)
{
if (type.Equals("SQL"))
{
return new SqlInstance();
}
else if (type.Equals("Oracle"))
{
return new OracleInstance();
}
return null;
}
}
public class facotoryCaseB : facotoryCase
{
public override DBInstance create(string type)
{
if (type.Equals("Mysql"))
{
return new MysqlInstance();
}
return null;
}
}
{
DBInstance di;
public DBInstance CreateInstance(string type)
{
di = create(type);
return di;
}
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)
{
if (type.Equals("SQL"))
{
return new SqlInstance();
}
else if (type.Equals("Oracle"))
{
return new OracleInstance();
}
return null;
}
}
public class facotoryCaseB : facotoryCase
{
public override DBInstance create(string type)
{
if (type.Equals("Mysql"))
{
return new MysqlInstance();
}
return null;
}
}
工廠方法模式定義了一個創建對象的接口,但由子類決定要實例化的類是哪一個。工廠方法讓類把實例化推遲到子類。
設計原則:要依賴抽象不要依賴具體類。
接下來再看下抽象工廠模式
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
{
DBInstanceforabstract di;
public Param GetParameter()
{
return new oracleparam();
}
public connection GetConnection()
{
return new oracleconnecttion();
}
}
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
{
DBInstanceforabstract di;
public Param GetParameter()
{
return new oracleparam();
}
public connection GetConnection()
{
return new oracleconnecttion();
}
}
抽象工廠模式提供一個接口,用于創建相關或依賴對象的家族而不需要明確指定具體類。
![]() |
原創作品允許轉載,轉載時請務必以超鏈接形式標明文章原始出處以及作者信息。 作者:熬夜的蟲子 點擊查看:博文索引 |

浙公網安備 33010602011771號