JAVA设计模式之3-抽象工厂模式
书接上文,简单工厂模式解决的是可以枚举种类的类的问题,但是带来了高耦合的问题,并且对类系列繁多无从下手,那么我们想起了一种方法,那就是抽象类,建一个抽象工厂,抽象工厂里的方法都是根据系列类的差异区分出来的抽象方法。
抽象工厂方法
根据WWH来学习
1,WHAT?
什么是抽象工厂模式呢?先来看看百度的解释
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。
上面是百度给的解释,那么联系我们举得例子,北汽绅宝汽车。
汽车三大件,发动机,变速箱,底盘,那么我们创建骑车对象需要这三个,而这三个又分为好多种类,比如说变速箱,AT,MT,所以,在这里我们需要创建一个抽象的变速箱,抽象的发动机,抽象的底盘,抽象的工厂,最后,所有的都是抽象的,然后具体的对象的类可以继承抽象类,根据里氏替换原则,子类是可以代替父类的,所以,最后实例化的是这些抽象产品的具体子类的实例。
2, WHY?
为什么要用呢?
步骤1上说了,这是抽象工厂模式中几乎都是抽象角色,这就给我们很大的扩展空间,只要继承这些抽象角色类就可以了,也就是说耦合度很低。
3, HOW?
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
怎么实现抽象工厂模式呢?
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /******************************************************/ 2 //产品类 3 public abstract class Engnie{} 4 //扩展151发动机 5 public class Engnie151 extends Engine{ 6 public Engnie151(){ 7 //need to do,实例化151发动机 8 } 9 } 10 //扩展153发动机 11 public class Engnie153 extends Engine{ 12 public Engnie153() { 13 //need to do ,实例化153发动机 14 } 15 } 16 /*********************************************************/ 17 //工厂类 18 public interface AbstractEngnie{ 19 public Engine createEngnie(); 20 } 21 //生产151发动机的工厂 22 public class CreateEng151 implements AbstractEngnie{ 23 public Engine createEngnie() { 24 return (Engine)new Engnie151(); 25 } 26 27 } 28 /*********************************************************/ 29 public class Customer{ 30 public void GetSB(){ 31 CreateEng151 ce151 = new CreateEng151(); 32 ce151.createEngine(); 33 } 34 }
上面的就是抽象工厂模式,这个模式最大的好处就是送耦合。
那么问题来了:简单工厂模式和抽象工厂模式的区别是什么呢?
抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。