天天看点

四、创建型模式——抽象工厂模式

工厂方法模式我们会发现 (1)多个具体产品类都衍生自同一个接口或抽象类。 (2)一个抽象工厂类,可以派生出多个具体工厂类。 (3)并且每个具体工厂类只能创建 一个 具体产品类的实例。   而抽象工厂模式是上述模式的升级版: (1)多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 (2)一个抽象工厂类,可以派生出多个具体工厂类。(同工厂方法模式) (3)并且每个具体工厂类可以创建 多个 具体产品类的实例。

四、创建型模式——抽象工厂模式

1.抽象工厂模式模式介绍 为创建 一组 相关或者是相互依赖的对象提供的一个接口,而不需要指定它们的具体类。 抽象工厂模式包括的角色: (1) 抽象产品类 :为各种产品声明抽象 接口或抽象类 。 (2) 具体产品类 :抽象产品类的实现类,为实现某个 具体产品 的对象。 (3) 抽象工厂类 :声明了 一组 (注意是一组,看了下面的例子就会明白和工厂方法模式的区别)用于创建 一种产品(每一个方法对应一种产品) 的方法。 (4) 具体工厂类 :继承抽象工厂类,生成 一组 具体产品(注意是一组,这很重要)。

2. 抽象工厂模式的实现 下面是两辆车的例子 ,有两款车内空调品牌,分别为海尔和海信。也有两种发动机品牌,分别为国产和进口。( 抽象工厂模式有多个产品抽象类,分别为空调抽象类和发动机抽象类 ) 对于A类车,搭载的是海尔空调和进口发动机。对于B类车,搭载的是海信空调和国产发动机。 (1)空调接口和具体空调类

public interface Airconditioner { 
void work();
}
   //具体产品
public class Airconditioner_Haier implements Airconditioner {       
@override   
 public void work() {      
  System.out.println(" Air_conditioner_Haier is working ...");      
 }      
}      
public class Airconditioner_HaiXin implements Airconditioner {       
@override   
 public void work() {      
  System.out.println(" Air_conditioner_HaiXin is working ...");      
 }      
}  
           

(2)发动机接口和具体发动机类

public interface Engine { 
void work();
}      
//具体产品
public class Engine_Import implements Engine {      
@override   
 public void work() {      
  System.out.println(" Engine_Import is working...");      
 }      
}      
public class Engine_Domestic implements Engine {      
@override  
 public void work() {      
  System.out.println(" Engine_Domestic is working. ...");      
 }      
}
           

(3)车接口及具体车类(抽象工厂和具体工厂)

public interface Abstract_CarFactory {      
 public Airconditioner install_air_conditioner();      
 public Engine install_engine();      
}      
//具体工厂A类    
public class CarA implements AbstractFactory {      
 public Airconditioner install_air_conditioner () {      
  return new Airconditioner_Haier();      
 }      
 public Engine install_engine () {      
  return new Engine_Import();
 }      
}
//具体工厂B类    
public class CarB implements AbstractFactory {      
 public Airconditioner install_air_conditioner () {      
  return new Airconditioner_HaiXin();      
 }      
 public Engine install_engine () {      
  return new Engine_Domestic();
 }      
} 
           

(4)客户调用

Abstract_CarFactory factoryA = new CarA();
factoryA. install_air_conditioner.work();
factoryA. install_engine().work();

Abstract_CarFactory factoryB = new CarB();
factoryB. install_air_conditioner.work();
factoryB. install_engine().work();
           

3.  抽象工厂模式的优缺点 抽象工厂模式的优点 (1)具有工厂方法模式 解耦的优点 。 (2)工厂模式针对的是 一个产品等级结构 ,抽象工厂模式针对的是面向 多个产品等级结构 的。 最主要的是可以在类内部对 产品族 的 关联关系进行定义和描述。 【重要拓展概念】 产品族的概念: 所谓的产品族,是指 位于 不同产品等级结构中功能相关联的产品 组成的家族。 举例说明, EngineA和EngineB即为两个不同的等级结构 ,他们都衍生于Engine类。但是这里有海尔、海信两种空调,并且这两种空调都搭载到两种车子内(从这两个维度看,是有四种类型的车子了)。 那么搭载海尔空调和国产发动机的车A就是一个产品族,而不同的空调就是产品等级体系结构   抽象工厂模式的缺点 (1)产品族的 扩展将是一件十分费力的事情 ,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。 (2)在具体工厂类的方法中,对于产品族里的产品,只能使用其中一个。这也比较容易理解,比如,一款车子不可以搭载两种空调。

4.抽象工厂模式什么时候使用 (1)同属于一个产品族的产品是在一起使用的,比如国产发动机和海尔空调同时在车A工厂中使用 (2)有多个抽象产品类

5.抽象工厂开闭原则的实现 (1)增加新的产品族 增加新的具体工厂类 (2)增加新的产品等级结构

四、创建型模式——抽象工厂模式

增加产品等级结构,我们就要修改所有工厂角色,给每个工厂类都增加一个新的工厂方法,这就违背了开闭原则, 所以不可以增加新的产品等级结构。