设计模式-抽象工厂模式

返回上一级目录: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。但是这个模式有个缺点就是不支持添加新种类的产品,否则就要修改抽象工厂来支持添加新种类的产品。

返回上一级目录:Java设计模式

原文地址:https://www.cnblogs.com/zhou-920644981/p/12218937.html