为建立一组相关或相互依赖的对象提供一个接口,并且无需指定它们的具体类。java
以女娲造人为例,定义人种(Product产品类)及八卦炉(工厂类)。为人类定义肤色及性别属性,从设计角度看,一个具体的对象能够经过肤色及性别肯定。生产的工厂类若是只有一个,生产出来的全都是男性或者女性,所以须要拆分为两个工具类。windows
人类接口编辑器
public interface Human { // 每一个人都有肤色 void getColor(); // 每一个人都有性别 void getSex(); }
抽象人种类(根据肤色划分)工具
/* * 白色人种 */ public abstract class AbstractWhiteHuman implements Human { public void getColor() { System.out.println("白色人种皮肤是白色的") } } /* * 黑色人种 */ public abstract class AbstractBlackHuman implements Human { public void getColor() { System.out.println("黑色人种皮肤是黑色的") } } /* * 黄色人种 */ public abstract class AbstractYellowHuman implements Human { public void getColor() { System.out.println("黄色人种皮肤是黄色的") } }
具体人类(产品类实现类),每一个抽象类都有两个实现类(男人和女人),实现性别的定义,以黄色人种为例操作系统
public class FemaleYellowHuman extends AbstractYellowHuman { public void getSex() { System.out.println("女性黄种人") } } public class MaleYellowHuman extends AbstractYellowHuman { public void getSex() { System.out.println("男性黄种人") } }
其它的黑色人种与白色人种的代码与此相似,再也不重复编写。到此全部的人种(产品类)已定义完毕,接下来须要定义八卦炉(工厂类)生产人类。设计
八卦炉接口unix
public interface HumanFactory { Human createYelloHuman(); Human createBlackHuman(); Human createWhiteHuman(); }
具体八卦炉(工厂实现类),按性别分为男性八卦炉及女性八卦炉code
public class FemaleFactory implements HumanFactory { public Human createYelloHuman() { return new FemaleYelloHuman(); } public Human createBlackHuman() { return new FemaleBlackHuman(); } public Human createWhiteHuman() { return new FemaleWhiteHuman(); } } public class MaleFactory implements HumanFactory { public Human createYelloHuman() { return new MaleYelloHuman(); } public Human createBlackHuman() { return new MaleBlackHuman(); } public Human createWhiteHuman() { return new MaleWhiteHuman(); } }
造人(场景类)视频
public class Client { public static void main(String[] args) { HumanFactory maleHumanFactory = new MaleFactory(); HumanFactory femaleHumanFactory = new FemaleFactory(); Human maleYellowHuman = maleHumanFactory.createYelloHuman(); Human maleBlackHuman = maleHumanFactory.createBlackHuman(); Human maleWhiteHuman = maleHumanFactory.createWhiteHuman(); Human femaleYellowHuman = femaleHumanFactory.createYelloHuman(); Human femaleBlackHuman = femaleHumanFactory.createBlackHuman(); Human femaleWhiteHuman = femaleHumanFactory.createWhiteHuman(); } }
抽象工厂模式是工厂方法模式的升级,在有多个业务品种,业务分类时,经过抽象工厂模式产生须要的对象。若是将八卦炉(工厂类)比喻为车间,那八卦炉的类型(人种性别)能够称做产品等级,八卦炉的生产工艺(人种肤色)能够称做产品线或产品族。抽象工厂类的职责是定义每一个工厂要实现的功能即产品线,有M个产品等级就应该有M个八卦炉(工厂实现类),有N个产品线,在八卦炉(抽象工厂类)中就应该有N个生产线(建立方法)。在场景类中,没有任何一个方法与产品实现类有关系,对于一个产品来讲,只须要知道它的工厂方法就能够直接生产一个产品对象,无需关心它的实现类。对象
一组没有任何关系的对象具备相同的约束,则可使用抽象工厂模式。一个视频编辑器及音频编辑器,在unix和windows操做系统中虽然功能和界面都相同,但代码的实现不一样。也就是所说的具备共同的约束条件(操做系统)。所以可以使用抽象工厂模式,产生不一样操做系统下的视频及音频处理器。
在抽象工厂模式的缺点中所说的是产品族扩展困难,而不是产品等级扩展困难。扩展产品等级只须要增长一个新的工厂实现类便可,也就是横向扩展容易,纵向扩展困难。