抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。
以创建人物为例
人分成男、女
而男女中又分成年轻、年迈
开始用java代码写抽象工厂模式
男孩、女孩接口
public interface Boy {
//创建一个男孩的方法
public void drawMan();
}
public interface Girl {
//创建一个女孩的方法
public void drawWomen();
}
年轻、年迈的男孩实现类
public class YouthBoy implements Boy {
@Override
public void drawMan() {
System.out.println("====年轻的男孩=====");
}
}
public class OldBoy implements Boy {
@Override
public void drawMan() {
System.out.println("====年迈的男孩====");
}
}
年轻、年迈的女孩实现类
public class YouthGirl implements Girl{
@Override
public void drawWomen() {
System.out.println("====年轻的女孩=====");
}
}
public class OldGirl implements Girl {
@Override
public void drawWomen() {
System.out.println("====年迈的女孩=====");
}
}
人物工厂接口
public interface PersonFactory {
//男孩接口
public Boy getBoy();
//女孩接口
public Girl getGirl();
}
年轻工厂(实例化年轻的人物)
public class YouthFactory implements PersonFactory {
@Override
public Boy getBoy() {
return new YouthBoy();
}
@Override
public Girl getGirl() {
return new YouthGirl();
}
}
年迈工厂(实例化年迈的人物)
public class OldFactory implements PersonFactory {
@Override
public Boy getBoy() {
return new OldBoy();
}
@Override
public Girl getGirl() {
return new OldGirl();
}
}
通过抽象工厂类实例化-年轻女孩类
public class Test {
public static void main(String[] args) {
//使用年轻加工厂
PersonFactory factory2= new YouthFactory();
//生产年轻的女孩类
Girl girl =factory2.getGirl();
//调用类方法
girl.drawWomen();
}
}
抽象工厂模式除了具有工厂方法模式的优点外
最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。
抽象工厂模式的缺点
产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。
适用场景
当需要创建的对象是一系列相互关联或相互依赖的产品族时,便可以使用抽象工厂模式。说的更明白一点,就是一个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着一定的关联或者约束,就可以使用抽象工厂模式。假如各个等级结构中的实现类之间不存在关联或约束,则使用多个独立的工厂来对产品进行创建,则更合适一点。
工厂模式和抽象工厂模式对比
- 工厂模式是一种极端情况的抽象工厂模式,而且抽象工厂模式可以看成是工厂模式的推广
- 工厂模式用来创建一个产品的等级结构,而抽象工厂模式是用来创建多个产品的等级结构
- 工厂模式只有一个抽象产品类,而抽象工厂模式有多个抽象产品类