JAVA 工厂模式-抽象工厂模式

提出问题

工厂方法模式的缺点:当生产 一组相关的商品时,处理起来比较复杂
比如:生产 手机保护膜、手机保护壳,这两种商品是相关的,该如何定义工厂类生成?

分析

使用 抽象工厂模式

说明

为创建一组相关或者是相互依赖的对象提供的一个接口,而不需要指定它们的具体类。

抽象工厂和工厂方法的模式基本一样,区别在于:工厂方法是生产一个具体的产品,而抽象工厂可以用来生产 一组相关产品,重点在于一组,一批,一系列

如:定义工厂接口,该接口有 生产手机保护膜方法、生产手机壳方法

作用

解决工厂方法的缺点,即:创建一系列相关产品时,需要定义非常多的工厂

例子

定义保护膜接口

/**
 * 保护膜接口
 */
public interface BaoHuMo {

    public void baoHuPingMu();
}

定义iphone11保护膜实现类

public class IPhone11Mo implements BaoHuMo{
    @Override
    public void baoHuPingMu() {
        System.out.println("iphone11保护膜");
    }
}

定义小米9保护膜实现类

public class Mi9Mo implements BaoHuMo{
    @Override
    public void baoHuPingMu() {
        System.out.println("小米9保护膜");
    }
}

定义手机壳接口

/**
 * 手机壳接口
 */
public interface ShouJiKe {

    public void baoHuShouJi();
}

定义iphone11手机壳实现类

public class IPhone11Ke implements ShouJiKe{
    @Override
    public void baoHuShouJi() {
        System.out.println("iphone11手机壳");
    }
}

定义小米9手机壳实现类

public class Mi9Ke implements ShouJiKe{
    @Override
    public void baoHuShouJi() {
        System.out.println("小米9手机壳");
    }
}

定义配件工厂接口

该工厂接口中,有2个方法,生产保护膜、生产保护壳,因为这是 一组/一系列 相关的商品,所以用 一个工厂接口定义

/**
 * 定义配件工厂接口
 */
public interface PeiJianFactory {

    /**
     * 生产保护膜
     * @return
     */
    public BaoHuMo createBaoHuMo();

    /**
     * 生产手机壳
     * @return
     */
    public ShouJiKe createShouJiKe();
}

定义iphone11配件工厂实现类

public class IPhone11PeiJianFactory implements PeiJianFactory{
    @Override
    public BaoHuMo createBaoHuMo() {
        return new IPhone11Mo();
    }

    @Override
    public ShouJiKe createShouJiKe() {
        return new IPhone11Ke();
    }
}

定义小米9配件工厂实现类

public class Mi9PeiJianFactory implements PeiJianFactory{
    @Override
    public BaoHuMo createBaoHuMo() {
        return new Mi9Mo();
    }

    @Override
    public ShouJiKe createShouJiKe() {
        return new Mi9Ke();
    }
}

定义测试类

public class Main {
    public static void main(String[] args) {
        PeiJianFactory iPhone11PeiJianFactory = new IPhone11PeiJianFactory();
        BaoHuMo iphone11Mo = iPhone11PeiJianFactory.createBaoHuMo();
        ShouJiKe iphone11Ke = iPhone11PeiJianFactory.createShouJiKe();
        iphone11Mo.baoHuPingMu();
        iphone11Ke.baoHuShouJi();

        System.out.println("-------");


        PeiJianFactory mi9PeiJianFactory = new Mi9PeiJianFactory();
        BaoHuMo mi9Mo = mi9PeiJianFactory.createBaoHuMo();
        ShouJiKe mi9Ke = mi9PeiJianFactory.createShouJiKe();
        mi9Mo.baoHuPingMu();
        mi9Ke.baoHuShouJi();
    }
}

工厂方法和抽象工厂的区别

工厂方法模式

一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式

多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下的多个产品。

区别:

工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
工厂方法创建 “一种” 产品,他的着重点在于”怎么创建”,也就是说如果你开发,你的大量代码很可能围绕着这种产品的构造,初始化这些细节上面。也因为如此,类似的产品之间有很多可以复用的特征,所以会和模版方法相随。

抽象工厂需要创建一些列产品,着重点在于”创建哪些”产品上,也就是说,如果你开发,你的主要任务是划分不同差异的产品线,并且尽量保持每条产品线接口一致,从而可以从同一个抽象工厂继承。

参考:
https://www.jianshu.com/p/38493eb4ffbd
https://www.cnblogs.com/geek6/p/3951677.html


原文出处:/show_1IX4eEaBn3xg.html