铺垫
要知道抽象模式最大的长处必须先了解什么是产品等级和产品族
在上面的类图中,两厢车和三厢车称为两个不同的等级结构。而2.0排量车和2.4排量车则称为两个不同的产品族。再详细一点,2.0排量两厢车和2.4排量两厢车属于同一个等级结构,2.0排量三厢车和2.4排量三厢车属于还有一个等级结构;而2.0排量两厢车和2.0排量三厢车属于同一个产品族,2.4排量两厢车和2.4排量三厢车属于还有一个产品族。
样例
接着上篇写的女娲造人
public interface Human { public void getColor(); public void talk(); public void getSex(); }
public abstract class AbstractYellowHuman implements Human{ public void getColor() { System.out.println("黄种人"); } public void talk() { System.out.println("汉语"); } }
public class MaleYellow extends AbstractYellowHuman { public void getSex() { System.out.println("黄种人男性"); } }
public class FemaleYellow extends AbstractYellowHuman { public void getSex() { System.out.println("黄种人女性"); } }
白种人和黑种人都一样。。
。
这里就不贴代码了
public interface HumanFactory { public Human createWhiteHuman(); public Human createBlackHuman(); public Human createYellowHuman(); }
public class FemaleFactory implements HumanFactory { public Human createBlackHuman() { return null; } public Human createWhiteHuman() { return null; } public Human createYellowHuman() { return new FemaleYellow(); } }
public class MaleFactory implements HumanFactory { public Human createBlackHuman() { return null; } public Human createWhiteHuman() { return null; } public Human createYellowHuman() { return new MaleYellow(); } }
public class Client { public static void main(String[] args) { HumanFactory factory=new MaleFactory(); MaleYellow maleYellow=(MaleYellow) factory.createYellowHuman(); maleYellow.talk(); } } /* Human接口 * 抽象类白种人AbstractWhiteHuman实现Human接口中俩个方法talk()和getColor(),这样就有了三种人 * 白种男人 MaleWhiteHuman 继承AbstractWhiteHuman 得到白种男人 * 白种女人 FemaleWhiteHuman 继承AbstractWhiteHuman得到白种女人 * 至于工厂就能够自己DIY了 * */
长处
可是能够满足多个等级结构,比如买牛奶和咖啡,再加上一个条件大杯还是小杯。
缺点
很难以扩展
适用场景
当须要创建的对象是一系列相互关联或相互依赖的产品族时,便能够使用抽象工厂模式。说的更明确一点,就是一个继承体系中,假设存在着多个等级结构(即存在着多个抽象类)。而且分属各个等级结构中的实现类之间存在着一定的关联或者约束,就能够使用抽象工厂模式。
假如各个等级结构中的实现类之间不存在关联或约束,则使用多个独立的工厂来对产品进行创建。则更合适一点。