设计模式之抽象工厂

抽象工厂相比于前两种工厂,应用场景少一些,但在特殊场景下,也能发挥非常好的作用。

抽象工厂用在哪写场景?

还是基于前两节的例子,基于果汁和酸奶的例子,如果现在我们不仅只生产饮品,还要生产苹果味的饼干,此时要怎么做呢?

按照工厂方法模式,需要再建立一个苹果饼干工厂来生产苹果饼干,如果还需要苹果为果冻,那就需要再建立苹果味果冻工厂,如果还需要…,结果就是要建立一大堆对应的工厂,这样的结果就是维护困难,而且代码也不友好。

此时就可以使用抽象工厂,抽象工厂的作用就是,在抽象工厂中定义不只一种产品的生产,然后由具体工厂实现,这样一个具体工厂就可以包含多种产品的生产了,工厂数量就减少了,类也就少了。

角色包括:

抽象工厂:定义多种产品的生产

具体工厂:继承抽象工厂,实现抽象工厂中定义的多种产品

抽象产品:定义产能特性

具体产品:生产具体产品

代码:

1、定义抽象工厂

package com.itzhimei.study.design.factory.abstractfactory;

public interface IAppleFactory {

    /**
     * 定义果汁方法
     * @return
     */
    IFruitsJuice getFruitsJuice();

    /**
     * 定义水果饼干方法
     * @return
     */
    IFruitsCookie getFruitsCookie();
}

抽象工厂的核心就在上面这里,这里由两个生产方法。

2、定义具体工厂,实现生产各类产品

package com.itzhimei.study.design.factory.abstractfactory;

/**
 * www.itzhimei.com
 * 具体工厂
 */
public class AppleFactory implements IAppleFactory {
    @Override
    public IFruitsJuice getFruitsJuice() {
        return new AppleJuice();
    }

    @Override
    public IFruitsCookie getFruitsCookie() {
        return new AppleCookie();
    }
}

3、定义抽象产品和实现抽象产品的具体产品

package com.itzhimei.study.design.factory.abstractfactory;

/**
 * www.itzhimei.com
 * 果汁接口
 */
public interface IFruitsJuice {

    /**
     * 定义果汁方法
     * @return
     */
    String getFruitsJuice();
}



package com.itzhimei.study.design.factory.abstractfactory;

/**
 * www.itzhimei.com
 * 苹果汁
 */
public class AppleJuice implements IFruitsJuice {
    @Override
    public String getFruitsJuice() {
        return "苹果汁";
    }
}
package com.itzhimei.study.design.factory.abstractfactory;

public interface IFruitsCookie {

    /**
     * 定义水果饼干方法
     * @return
     */
    String getFruitsCookie();
}


package com.itzhimei.study.design.factory.abstractfactory;

/**
 * www.itzhimei.com
 * 苹果饼干
 */
public class AppleCookie implements IFruitsCookie {

    @Override
    public String getFruitsCookie() {
        return "苹果饼干";
    }
}

4、测试

package com.itzhimei.study.design.factory.abstractfactory;

/**
 * www.itzhimei.com
 * 测试
 */
public class Client {

    public static void main(String[] args) {
        IAppleFactory af = new AppleFactory();
        System.out.println(af.getFruitsJuice().getFruitsJuice());
        System.out.println(af.getFruitsCookie().getFruitsCookie());
    }
}

涉及的类:

类关系图:

总结:

学习了上面的内容和代码之后,抽象工厂其实从名字也能看出其特性,就是对工厂的抽象,也就对工厂类数量的简化,对单个工厂能力的提升,因为一个工厂中生产的产品变多了。