抽象工厂模式意为提供一个可以创建一组或者相关的对象的接口,跟工厂模式很相似,工厂模式创建的是同种类别下的不同产品,抽象工厂是创建多种相关类别下的不同产品。比如工厂模式是鱼,那么它对应产品可以是鲤鱼,草鱼,鲸鱼。而放到抽象工厂模式,它就不只是可以创建鱼这一类,还可以是藻类,如红藻,绿藻。还可以是鱼生活的地方,如海洋,河流,池塘,油锅。抽象工厂的模型角色跟工厂模式模型一样:
- 1.抽象工厂:模式核心,所有具体工厂都要实现这个接口。通常是包含创建多个类别产品的方法。
- 2.具体工厂:实现抽象工厂,根据具体需要创建具体产品对象。
- 3.抽象产品:定义产品的共性。
- 4.具体产品:具体的产品,拥有所有产品的共性,也拥有自己的特性。
工厂模式里拿的买饮料作为例子,这里同样使用这个。但是去饮料店有些不会只卖饮料,还可能卖面包或者还有其他。所以再抽象工厂里需要多定义出面包这类产品:
public interface DrinksFactory {
//饮料
Drinks dBuild();
//面包
Bread bBuild();
void buyWhat();
}
抽象产品,对应的面包,饮料:
public abstract class Bread {
public abstract String buy();
}
public abstract class Drinks {
public abstract String otherDoSing();
}
具体产品:
public class AppleDrinks extends Drinks {
@Override
public String otherDoSing() {
return "苹果汁";
}
}
public class LemonDrinks extends Drinks {
@Override
public String otherDoSing() {
return "柠檬汁";
}
}
public class LemonBread extends Bread {
@Override
public String buy() {
return "柠檬派";
}
}
public class AppleBread extends Bread{
@Override
public String buy() {
return "苹果派";
}
}
具体工厂。这个情景下再叫工厂就不太合适了,现在比喻成两个具体的人要到这个店里面买东西,一个人偏爱苹果,另一个偏爱柠檬。
public class AppleFactory implements DrinksFactory {
@Override
public Drinks dBuild() {
return new AppleDrinks();
}
@Override
public Bread bBuild() {
return new AppleBread();
}
@Override
public void buyWhat() {
Log.d("buyWhat", "buyWhat: "+dBuild().otherDoSing()+", "+bBuild().buy());
}
}
public class LemonFactory implements DrinksFactory {
@Override
public Drinks dBuild() {
return new LemonDrinks();
}
@Override
public Bread bBuild() {
return new LemonBread();
}
@Override
public void buyWhat() {
Log.d("buyWhat", "buyWhat: "+dBuild().otherDoSing()+", "+bBuild().buy());
}
}
这俩人都买自己偏爱的食物:
DrinksFactory factory = new AppleFactory();
DrinksFactory factory2 = new LemonFactory();
factory.buyWhat();
factory2.buyWhat();
结果:
D/buyWhat: buyWhat: 苹果汁, 苹果派
D/buyWhat: buyWhat: 柠檬汁, 柠檬派
抽象工厂模式特点:
抽象工厂是工厂方法的进一步抽象,针对同个类别下的不同种对象。如果只有一种产品的话,抽象工厂模式就退化成工厂方法模式了。具有工厂模式一样的优良封装性,结构清晰,解耦。缺点是要拓展本类别对象会很复杂。需要修改抽象工厂接口,影响到其他产品工厂类。