继上一篇文章笔者介绍了工厂模式中的工厂方法模式,这次笔者将介绍工厂模式中的另外一个类别:抽象工厂模式
不过我们首先将工厂模式中的三个分类再次简单浏览下:
工厂模式的分类:
1.简单工厂模式
2.工厂方法模式
3.抽象工厂模式
那么,什么是抽象工厂模式:
给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足一下条件:
1.系统中有多个产品族,而系统一次只可能消费其中一族产品。
2.同属于同一个产品族的产品以其使用。
抽象工厂模式的各个角色(和上一篇中的工厂方法模式一样):
1.抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
2.具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
3.抽象产品角色:它是具体产品继承的父类或者是实现的接口。
4.具体产品角色:具体工厂角色所创建的对象就是此角色的实例
在这里我们同样以买车为例,不过这里我们有2个产品簇(宝马需要配置空调):
1.Bmw(宝马类)
(1)Bmw320
(2)Bmw523
2.AirCondition(空调类)
(1)AirConditionBmw320
(2)AirConditionBmw523
首先是抽象产品类Bmw,AirCondition:
package com.kameleon.abstractFactory;
public abstract class Bmw{
public void drive(){}
}
package com.kameleon.abstractFactory;
public abstract class AirCondition {
public void air(){}
}
之后是具体产品类:
Bmw320,Bmw523,AirConditionBmw320,AirCondition523
package com.kameleon.abstractFactory;
public class Bmw320 extends Bmw{
@Override
public void drive(){
System.out.println("I'm driving Bmw320");
}
}
package com.kameleon.abstractFactory;
public class Bmw523 extends Bmw{
@Override
public void drive(){
System.out.println("I'm driving Bmw523");
}
}
package com.kameleon.abstractFactory;
public class AirConditionBmw320 extends AirCondition{
@Override
public void air(){
System.out.println("This is Bmw320'aircondition");
}
}
package com.kameleon.abstractFactory;
public class AirConditionBmw523 extends AirCondition{
@Override
public void air(){
System.out.println("This is Bmw523'aircondition");
}
}
之后是我们的抽象工厂类FactoryBmw:
package com.kameleon.abstractFactory;
public interface FactoryBmw {
public Bmw createBmw();
public AirCondition createAirC();
}
最后是我们的具体工厂类FactoryBmw320,FactoryBmw523:
package com.kameleon.abstractFactory;
public class FactoryBmw320 implements FactoryBmw{
@Override
public Bmw createBmw() {
return new Bmw320();
}
@Override
public AirCondition createAirC() {
return new AirConditionBmw320();
}
}
package com.kameleon.abstractFactory;
public class FactoryBmw523 implements FactoryBmw{
@Override
public Bmw createBmw() {
return new Bmw523();
}
@Override
public AirCondition createAirC() {
return new AirConditionBmw523();
}
}
测试类笔者就不再一一列举了,接下来我们分析下抽象工厂模式:
首先是抽象工厂模式的整体结构:
可以发现抽象工厂模式和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。有多少个产品等级结构,就会在工厂角色中发现多少个工厂方法。另外,每一个产品等级结构中有多少具体产品,就有多少个产品族,也就会在工厂等级结构中发现多少个具体工厂。
那么什么时候适合使用抽象工厂模式呢?
1.一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节。这对于所有形态的工厂模式都是重要的
2.这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品
(上面这一条叫做抽象工厂模式的原始用意)
3.同属于同一个产品族的产品是在一起使用的,这一约束必须要在系统的设计中体现出来
4.系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现
总之,以上就是笔者在学习以及查找有关资料的过程中对工厂模式的总结,也希望读者能够与笔者一起对这个模式进行研究以及适当的使用,笔者也会继续努力研究其他设计模式,并且结合自己的经验分享给大家!
如有问题,欢迎大家指出!