抽象工廠模式 Abstract Factory

2021-09-05 22:08:45 字數 3254 閱讀 9859

開閉原則和依賴倒置原則是物件導向設計的重點,程式設計是一門藝術,大批量的改動,是不好看的做法。

1. 工廠方法模式(不是抽象工廠)是定義乙個用於建立物件的介面,讓子類中實現這個介面的方法中的內容決定例項化那乙個類(new 什麼類)。

2. 抽象工廠模式提供幾個建立類的介面,具體抽象子類利用父類定義的方法建立相關的「產品抽象型別」的一組子類具體實現。

3. 從上圖中可以看出,抽象工廠介面的所有子類實現中中也定義有乙個工廠方法,上圖有些亂,元素命名不是很容易懂,但圖的結構完全正確可以結合**去理解。

4. 上圖中ifactory 是乙個抽象工廠介面,他裡面應該包含所有的產品(所有指abstractproducta下面的所有子類的個數,而不是abstractproduct抽象類的個數)建立的抽象方法。產品抽象和抽象工廠所關注的是乙個橫向乙個縱向

5. 也就是通常是在執行時刻再建立乙個concretefactory類的例項,這個具體的工廠再建立具有特定實現的產品物件,也就是說,為建立不同的產品物件,客戶端應該使用不同的具體工廠。

6. 反射格式 assembly.load(「程式集名稱」).createinstance(「命名空間.類名稱」)

7. 利用反射可以使用字串形式來例項化物件,而一般的情況例項化是寫死在程式中的,將程式由編譯時轉為執行時。

8. 所有在用簡單工廠的地方,都可以考慮用反射技術來去除switch或if ,傑出分支判斷帶來的耦合。

9. 無痴迷,不成功

上圖中的源**

using system;

using system.collections.generic;

using system.text;

namespace 抽象工廠模式

}/// ///

抽象工廠

///

abstract class

abstractfactory

/// ///

具體抽象工廠,抽象了訪問sqlserver 方式

///

class

concretefactory1 : abstractfactory

public override abstractproductb createproductb()

}/// ///

access

///

class

concretefactory2 : abstractfactory

public override abstractproductb createproductb()

}/// ///

產品抽象a,user表

///

abstract class

abstractproducta

/// ///

產品抽象b 部門表

///

abstract class

abstractproductb

#region concretefactory1抽象工廠職能 ,比如sql server

//實現 產品抽象a

class

producta1 : abstractproducta

//實現產品抽象b

class

productb1 : abstractproductb

}#endregion

#region concretefactory2抽象工廠職能 ,比如access

class

producta2 : abstractproducta

class

productb2 : abstractproductb

}#endregion

/// ///

客戶端程式

///

class

client

//展示結果

public void run()}}

示例2 反射+ 簡單工廠

using system;

using system.collections.generic;

using system.text;

using system.reflection;

using system.configuration;

namespace 抽象工廠模式

}#region 實體層

class

user

set

}private string _name;

public string name

set }}

class

department

set

}private string _deptname;

public string deptname

set }}

#endregion

#region 使用者表

inte***ce

iuser

class

sqlserveruser : iuser

public user getuser(int id)

}class

accessuser : iuser

public user getuser(int id)

}#endregion

#region 部門表

inte***ce

idepartment

class

sqlserverdepartment : idepartment

public department getdepartment(int id)

}class

accessdepartment : idepartment

public department getdepartment(int id)

}#endregion

/// ///

簡單工廠反射

///

class

dataaccess

public static idepartment createdepartment()}}

抽象工廠模式 抽象工廠模式

抽象工廠模式其實是圍繞了乙個超級工廠建立其他的工廠 可參考工廠模式 這個超級工廠又可以想像成是其他工廠的工廠,這種設計模式是一種建立型模式。在抽象工廠模式中,介面是負責建立乙個相關物件的工廠,不需要顯式指出其類。每個生成的工廠都能按照工廠模式提供物件。意圖提供乙個建立一系列相關或相互依賴物件的介面,...

工廠模式 抽象工廠模式

這裡使用簡單的話來講解工廠模式,不涉及程式設計 什麼是工廠模式呢?我的理解是對抽象介面例項的封裝。假如有乙個介面,有若干的實現類,代表不同的例項。傳統產生物件的方法是直接new乙個出來,對於每個例項都要new,當實現介面的類較多時會很麻煩,並且類的實現也暴露出來了。工廠模式是一種產生物件的模式,使用...

工廠模式 抽象工廠模式

子類父類代換 場景 在不同的條件下,需要建立不同的實現子類時。如網路通訊可以使用tcp udp。可以實現同乙個介面,通過工廠類根據條件 tcp或udp 來例項化不同的子類。這些子類符合黎克特制代換原則。public inte ce tlprotocol public class tcpimpleme...