23种设计模式之-----抽象工厂模式(AbstractFactory pattern)

来源:互联网 发布:c语言 变量初始化顺序 编辑:程序博客网 时间:2024/06/05 14:28

抽象工厂模式(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 {@Overridepublic void strong() {System.out.println("黄种男人的强壮!");}}


黄种女人:

public class YellowWoman implements Woman{@Overridepublic void beautiful() {System.out.println("黄种女人的漂亮!");}}

白种男人:

public class WhiteMan implements Man {@Overridepublic void strong() {System.out.println("白种男人的强壮!");}}


白种女人:

public class WhiteWoman implements Woman{@Overridepublic void beautiful() {System.out.println("白种女人的漂亮!");}}


黑种男人:

public class BlockMan implements Man{@Overridepublic void strong() {System.out.println("黑种男人的强壮!");}}


黑种女人:

public class BlockWoman implements Woman{@Overridepublic void beautiful() {System.out.println("黑种女人的漂亮!");}}


总工厂:

同时生产男人和女人(此处看作同一产品族,不同肤色看作不同产品等级结构)。

public interface HumanFactory { Man createMan(); Woman createWoman();}


黄种人生产线:

public class YellowFactory implements HumanFactory{@Overridepublic Man createMan() {return new YellowMan();}@Overridepublic Woman createWoman() {return new YellowWoman();}}



白种人生产线:
public class WhiteFactory implements HumanFactory {@Overridepublic Man createMan() {return new WhiteMan();}@Overridepublic Woman createWoman() {return new WhiteWoman();}}



黑种人生产线:

public class BlockFactory implements HumanFactory{@Overridepublic Man createMan() {return new BlockMan();}@Overridepublic 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、增加产品,需要增加新的工厂类,导致系统类的个数成对增加,在一定程度上增加了系统的复杂性。

抽象工厂:

抽象工厂对开闭原则具有一定的倾斜性,比如以上栗子中,如果你要增加肤色,只需要增加相应的肤色人种和相应的肤色工厂就可以,这样很完美的贴合开闭原则。但是如果你要增加性别,那么你就需要修改所有的工厂,这样完全破坏了开闭原则。