引言
抽象工廠模式一種創(chuàng)建型設(shè)計(jì)模式,它提供了一種方式來(lái)封裝一組具有相同主題的工廠,而不必指定它們具體的類。這樣,客戶端代碼就可以使用抽象工廠來(lái)創(chuàng)建一組相關(guān)的對(duì)象,而不必關(guān)心實(shí)際創(chuàng)建的具體類。
抽象工廠模式有以下幾個(gè)主要角色:
-
抽象工廠(AbstractFactory):聲明用于創(chuàng)建抽象產(chǎn)品的操作的接口。
-
工廠實(shí)現(xiàn)(ConcreteFactory):實(shí)現(xiàn)創(chuàng)建具體產(chǎn)品對(duì)象的操作。
-
抽象產(chǎn)品(AbstractProduct):聲明產(chǎn)品對(duì)象類型的接口。
-
產(chǎn)品實(shí)現(xiàn)(Product):定義由相應(yīng)的具體工廠創(chuàng)建的產(chǎn)品對(duì)象,實(shí)現(xiàn)AbstractProduct接口。
下面使用C#實(shí)現(xiàn)抽象工廠模式:
抽象工廠
定義一個(gè)抽象工廠接口,其中包含了創(chuàng)建不同產(chǎn)品的方法:
public interface IAbstractFactory
{
IProductA CreateProductA();
IProductB CreateProductB();
}
工廠實(shí)現(xiàn)
定義具體的工廠類,實(shí)現(xiàn)抽象工廠接口:
public class ConcreteFactory1 : IAbstractFactory
{
public IProductA CreateProductA()
{
return new ConcreteProductA1();
}
public IProductB CreateProductB()
{
return new ConcreteProductB1();
}
}
public class ConcreteFactory2 : IAbstractFactory
{
public IProductA CreateProductA()
{
return new ConcreteProductA2();
}
public IProductB CreateProductB()
{
return new ConcreteProductB2();
}
}
在上述示例中,我們定義了兩個(gè)具體工廠類:ConcreteFactory1
和ConcreteFactory2
。這兩個(gè)工廠類都實(shí)現(xiàn)了IAbstractFactory
接口,并且分別提供了不同的產(chǎn)品實(shí)現(xiàn)。
抽象產(chǎn)品
public interface IProductA
{
string GetName();
}
產(chǎn)品實(shí)現(xiàn)
public class ConcreteProductA1 : IProductA
{
public string GetName()
{
return "ProductA1";
}
}
public class ConcreteProductA2 : IProductA
{
public string GetName()
{
return "ProductA2";
}
}
public interface IProductB
{
string GetName();
}
public class ConcreteProductB1 : IProductB
{
public string GetName()
{
return "ProductB1";
}
}
public class ConcreteProductB2 : IProductB
{
public string GetName()
{
return "ProductB2";
}
}
下面,我們可以使用抽象工廠來(lái)創(chuàng)建一組相關(guān)的對(duì)象:
public class Client
{
private IAbstractFactory factory;
public Client(IAbstractFactory factory)
{
this.factory = factory;
}
public void Run()
{
var productA = factory.CreateProductA();
var productB = factory.CreateProductB();
Console.WriteLine(productA.GetName());
Console.WriteLine(productB.GetName());
}
}
static void Main(string[] args)
{
var client1 = new Client(new ConcreteFactory1());
client1.Run();
var client2 = new Client(new ConcreteFactory2());
client2.Run();
}
輸出:
ProductA1
ProductB1
ProductA2
ProductB2
總結(jié)
上面的示例中,我們使用抽象工廠模式來(lái)創(chuàng)建了一組相關(guān)的對(duì)象,但是需要注意的是,它適用于創(chuàng)建一組相關(guān)的產(chǎn)品對(duì)象,但是當(dāng)產(chǎn)品族的變化引起整個(gè)工廠等級(jí)結(jié)構(gòu)的變化時(shí),抽象工廠模式就不適用了。
此外,抽象工廠模式還存在一些缺點(diǎn),例如:
-
新增產(chǎn)品會(huì)導(dǎo)致工廠接口的擴(kuò)展。如果需要新增產(chǎn)品,就需要修改所有的工廠類,這會(huì)帶來(lái)一些不必要的麻煩。
-
可能會(huì)導(dǎo)致類層次結(jié)構(gòu)的復(fù)雜度增加。如果有多個(gè)產(chǎn)品族,就需要定義多個(gè)工廠接口,這會(huì)增加類層次結(jié)構(gòu)的復(fù)雜度。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-536759.html
因此,在使用抽象工廠模式時(shí),需要根據(jù)具體情況進(jìn)行權(quán)衡和選擇。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-536759.html
到了這里,關(guān)于重溫設(shè)計(jì)模式 --- 抽象工廠模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!