返回上一级目录:Java设计模式
抽象工厂模式,相对于工厂方法模式来说,抽象工厂模式是用于产品簇的创建,向调用者提供多个系列产品对象。比如一套服饰,有衣服,有鞋,衣服属衣服产品类,鞋属鞋产品类,通过抽象工厂模式可以创建不同的衣服和鞋的组合。
抽象工厂模式有4中角色:抽象工厂角色,具体工厂角色,抽象产品角色,具体产品角色。
类关系图如下:
抽象工厂角色,负责产品簇所有产品的创建,抽象工厂模式的核心
/** * @Author zhouw * @Description 产品簇工厂 * @Date 2020-01-17 */ public interface EleFactory { IComputer getComputer(); IPhone getPhone(); }
抽象产品角色,产品簇中的抽象产品接口,有多个组成一个产品簇,例子中的产品簇由“IPhone”和“IComputer”组成
public interface IPhone { String getPhoneName(); }
public interface IComputer { String getComputerName(); }
具体产品角色,抽象产品的具体实例,最终调用者需要的对象,包含真正的业务逻辑
public class HuaweiPhone implements IPhone { @Override public String getPhoneName() { return "华为手机"; } }
public class HuaweiComputor implements IComputer { @Override public String getComputerName() { return "华为电脑"; } }
public class SumsungPhone implements IPhone { @Override public String getPhoneName() { return "三星手机"; } }
public class SumsungComputor implements IComputer { @Override public String getComputerName() { return "三星电脑"; } }
public class LenovoComputer implements IComputer { @Override public String getComputerName() { return "联想电脑"; } }
具体工厂角色,调用者通过具体工厂来创建产品实例,不同产品的组合应该有不同的产品工厂来创建,怎么组合产品由业务逻辑决定,这里以人使用的电子产品作为一个产品簇为例
小明的电子产品
public class XiaomingEle implements EleFactory { @Override public IComputer getComputer() { return new HuaweiComputor(); } @Override public IPhone getPhone() { return new HuaweiPhone(); } }
小红的电子产品
public class XiaohongEle implements EleFactory { @Override public IComputer getComputer() { return new HuaweiComputor(); } @Override public IPhone getPhone() { return new SumsungPhone(); } }
小黑的电子产品
public class XiaoheiEle implements EleFactory { @Override public IComputer getComputer() { return new SumsungComputor(); } @Override public IPhone getPhone() { return null; } }
小胖的电子产品
public class XiaopangEle implements EleFactory { @Override public IComputer getComputer() { return null; } @Override public IPhone getPhone() { return null; } }
最后看下应用
public class Application { public static void main(String[] args) { XiaomingEle xiaoming = new XiaomingEle(); System.out.println("我是小明," + say(xiaoming)); XiaohongEle xiaohong = new XiaohongEle(); System.out.println("我是小红," + say(xiaohong)); XiaoheiEle xiaohei = new XiaoheiEle(); System.out.println("我是小黑," + say(xiaohei)); XiaopangEle xiaopang = new XiaopangEle(); System.out.println("我,小胖," + say(xiaopang)); } private static String say(EleFactory ele) { if (ele.getComputer() == null && ele.getPhone() == null) { return "我很穷,我用不起电脑和手机"; } else if (ele.getComputer() == null) { return "我用不起电脑,我用的是" + ele.getPhone().getPhoneName(); } else if (ele.getPhone() == null) { return "我用不起手机,我用的是" + ele.getComputer().getComputerName(); } else { return "我用的是" + ele.getComputer().getComputerName() + "和" + ele.getPhone().getPhoneName(); } } }
输出:
总结
可以看出,抽象工厂模式是对工厂方法模式的进一步抽象,将不同种类的产品组合到一起创建,这样有一个好处就是可以保证系列产品的一致性,也可以说是多个对象的适配,而实际上这种应用场景很多,比如最常见的Servlet和ServletMapping。但是这个模式有个缺点就是不支持添加新种类的产品,否则就要修改抽象工厂来支持添加新种类的产品。