今天学习到抽象工厂模式,可以将它与工厂方法模式进行对比这样来学习:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
大话中通过访问不同的数据库SQL和Access明确的阐述了抽象工厂模式的意义:
抽象工厂模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类!
下面附加抽象工厂模式的基本代码:
class Program { static void Main(string[] args) { AbstractFactory factory1 = new ConcreteFactory1(); Client c1 = new Client(factory1); c1.Run(); AbstractFactory factory2 = new ConcreteFactory2(); Client c2 = new Client(factory2); c2.Run(); Console.Read(); } } abstract class AbstractFactory { public abstract AbstractProductA CreateProductA(); public abstract AbstractProductB CreateProductB(); } class ConcreteFactory1 : AbstractFactory { public override AbstractProductA CreateProductA() { return new ProductA1(); } public override AbstractProductB CreateProductB() { return new ProductB1(); } } class ConcreteFactory2 : AbstractFactory { public override AbstractProductA CreateProductA() { return new ProductA2(); } public override AbstractProductB CreateProductB() { return new ProductB2(); } } abstract class AbstractProductA { } abstract class AbstractProductB { public abstract void Interact(AbstractProductA a); } class ProductA1 : AbstractProductA { } class ProductB1 : AbstractProductB { public override void Interact(AbstractProductA a) { Console.WriteLine(this.GetType().Name + " interacts with " + a.GetType().Name); } } class ProductA2 : AbstractProductA { } class ProductB2 : AbstractProductB { public override void Interact(AbstractProductA a) { Console.WriteLine(this.GetType().Name + " interacts with " + a.GetType().Name); } } class Client { private AbstractProductA AbstractProductA; private AbstractProductB AbstractProductB; public Client(AbstractFactory factory) { AbstractProductB = factory.CreateProductB(); AbstractProductA = factory.CreateProductA(); } public void Run() { AbstractProductB.Interact(AbstractProductA); } }下面是抽象工厂模式的结构图:
抽象工厂模式的优缺点:
最大的优点便是易于交换产品系列,由于具体工厂类在一个应用中需要在初始化的时候出现一次,所以就使得改变一个应用的具体工厂变得非常容易,只需要改变具体工厂即可使用不同的产品配置。第二,能让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。
编程是门艺术。。。。。。。