抽象工厂模式

抽象工厂模式

抽象工厂(Kit)模式提供一个接口,用来创建相关或依赖对象的家族,而不需要明确指定具体类。

 

特点:

1. 抽象工厂模式面对的问题是多个产品等级结构的系统设计

2. 抽象工厂模式是工厂方法的进一步推广

3. 抽象工厂将产品对象的创建延迟到它的具体工厂的子类。

4. 通常在运行时刻创建一个具体工厂类的实例,这一具体工厂的创建具有特定实现的产品对象,为创建不同的产品对象,客户应使用不同的具体工厂。

 

实现:

clip_image002

抽象工厂(提供不同等级结构的产品工厂):

public interface Creator
{

  public ProductA factoryA();
  public ProductB factoryB();
}

具体工厂(实现不同等级结构中的某一族产品对象):

public class ConcreteCreator1 implements Creator
{ 
 public ProductA factoryA() { return new ProductA1(); }
public
ProductB factoryB() { return new ProductB1(); }
}

 

public class ConcreteCreator2 implements Creator
{
 public ProductA factoryA() { return new ProductA1();}
 public ProductB factoryB() { return new ProductB1(); }
 }

抽象产品:

public interface ProductA
{
}
public interface ProductB
{
}具体产品: 
public class ProductA1 implements ProductA
{
    
public
ProductA1() { }
}

 

public class ProductA2 implements ProductA
{
    
public
ProductA2() { }
}
public class ProductB1 implements ProductA
{
 public ProductB1() { }
 }
public class ProductB2 implements ProductA
{
 public ProductB2() { }
 }

相图:

每一个产品族都有一个具体工厂。而每一个具体工厂负责创建属于同一个产品族、但是分属于不同等级结构的产品。

clip_image004

 

适用性:

1. 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节。这对于所有形态的工厂模式都是重要的

2. 这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品

3. 同属于同一个产品族的产品是在一起使用的,这一约束必须要在系统的设计中体现出来

4. 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现

 

参与者:

  1. AbstractFactory:创建抽象产品对象的接口
  2. ConcreteFactory:实现创建具体产品对象的操作
  3. AbstractProduct:为一类产品对象声明一个接口
  4. ConcreteProduct:定义一个将被相应的具体工厂创建的产品对象,实现AbstractProduct接口
  5. Client:仅使用由AbstractFactory和AbstractProduct类声明的接口

 

优点:

1. 分离了具体的类。抽象工厂模式帮助你控制一个应用创建的对象的类,因为一个工厂封装创建产品对象的责任和过程。它将客户和类的实现分离,客户通过他们的抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户代码中。

2. 它使得易于交换产品系列。一个具体工厂类在一个应用中仅出现一次——即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变。

3. 它有利于产品的一致性。当一个系列的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要,而抽象工厂很容易实现这一点。

缺点:

增加新的产品等级结构的时候,要改变抽象工厂接口,不支持“开-闭”原则

作者:God bless you
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
原文地址:https://www.cnblogs.com/luckForever/p/7254953.html