抽象工厂模式(Abstract Factory Pattern)是工厂方法模式的进一步抽象,其英文原话"Provide an interface for creating families of related or dependent objects without specifying their concrete classes",翻译,“为创建一组相关或相互依赖的对象提供一个借口,无需指定它们的具体类”。抽象工厂模式通常是用于创一族产品,并且这族产品分不同的等级;不同的具体工厂类生产不同等级的一族产品。抽象工厂模式也有四种角色:抽象工厂、具体工厂、抽象产品和具体产品,具体解释参见“Java 工厂方法模式”一文。
在上文女娲造人的基础上,想把性别分出来,大概刚开始造的人没分什么男女吧~于是有:
男人:
public interface Man {
//强壮
public void strong();
}
女人:
public interface Woman {
//漂亮
public void beautiful();
}
黄种男人:
public class YellowMan implements Man {
@Override
public void strong() {
System.out.println("黄种男人的强壮!");
}
}
黄种女人:
public class YellowWoman implements Woman{
@Override
public void beautiful() {
System.out.println("黄种女人的漂亮!");
}
}
白种男人:
public class WhiteMan implements Man {
@Override
public void strong() {
System.out.println("白种男人的强壮!");
}
}
白种女人:
public class WhiteWoman implements Woman{
@Override
public void beautiful() {
System.out.println("白种女人的漂亮!");
}
}
黑种男人:
public class BlockMan implements Man{
@Override
public void strong() {
System.out.println("黑种男人的强壮!");
}
}
黑种女人:
public class BlockWoman implements Woman{
@Override
public void beautiful() {
System.out.println("黑种女人的漂亮!");
}
}
总工厂:
同时生产男人和女人(此处看作同一产品族,不同肤色看作不同产品等级结构)。
public interface HumanFactory {
Man createMan();
Woman createWoman();
}
黄种人生产线:
public class YellowFactory implements HumanFactory{
@Override
public Man createMan() {
return new YellowMan();
}
@Override
public Woman createWoman() {
return new YellowWoman();
}
}
白种人生产线:
public class WhiteFactory implements HumanFactory {
@Override
public Man createMan() {
return new WhiteMan();
}
@Override
public Woman createWoman() {
return new WhiteWoman();
}
}
黑种人生产线:
public class BlockFactory implements HumanFactory{
@Override
public Man createMan() {
return new BlockMan();
}
@Override
public Woman createWoman() {
return new BlockWoman();
}
}
女娲开始生产人:
public class Nvwa {
public static void main(String[] args) {
//创建黄色的男人和女人
HumanFactory hf = new YellowFactory();
hf.createMan().strong();
hf.createWoman().beautiful();
//创建黑色的男人和女人
HumanFactory wf = new WhiteFactory();
wf.createMan().strong();
wf.createWoman().beautiful();
//创建白色的男人和女人
HumanFactory bf = new BlockFactory();
bf.createWoman().beautiful();
bf.createMan().strong();
}
}
最后我们看看造人结果:
三种工厂模式的对比:
简单工厂:
优点:
1、屏蔽产品的具体实现,调用者只关心产品的接口。
2、实现简单
缺点:
1、增加产品,需要修改工厂类,不符合开放-封闭原则
2、工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则
工厂方法:优点:
1、继承了简单工厂模式的优点
2、符合开放-封闭原则
缺点:
1、增加产品,需要增加新的工厂类,导致系统类的个数成对增加,在一定程度上增加了系统的复杂性。
抽象工厂:
抽象工厂对开闭原则具有一定的倾斜性,比如以上栗子中,如果你要增加肤色,只需要增加相应的肤色人种和相应的肤色工厂就可以,这样很完美的贴合开闭原则。但是如果你要增加性别,那么你就需要修改所有的工厂,这样完全破坏了开闭原则。