抽象工厂模式

抽象工厂模式属于对象创建型模式,意图为提供一个创建一系列相关联的对象的接口,而无需指定他们具体类的实现。

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

抽象工厂模式的的适用性

抽象工厂模式主要适用于以下情况:

  • 一个系统的创建要独立于它所包含的各项产品的创建、组装、表示。
  • 一个系统由多套产品系列中的某一套来配置。
  • 当需要强调有关联关系的不同产品对象的设计以便于联合使用。
  • 当需要提供一个产品类库时,只需要提供产品的创建接口而不提供其具体实现时。

 抽象工厂模式的具体实现结构

                                         java设计模式--抽象工厂模式 随笔

抽象工厂模式的应用

下面,我们通过抽象工厂模式来实现一个一个具体的应用场景:

  以一个手机装配工厂为例,该工厂可以组装苹果手机、三星手机、华为手机、小米手机,组装每一款手机都需要不同型号的屏幕、主板、CPU等硬件,现在我们假定每款手机需要的硬件各不相同,只有正确的拿到每款手机所对应的硬件,那么该手机组装成功。

  我们以组装苹果手机和华为手机为例,苹果手机需要苹果屏幕和苹果CPU,而华为手机需要华为屏幕和华为CPU,在组装手机的过程中,每款配件都是有关联性的。

  该工厂只要通知员工组装华为手机那么员工会自己选择好华为手机的屏幕和华为手机的CPU,苹果手机相同。

  我们来定义一个生产手机的工厂抽象类:

public interface ProducePhoneFactory {
    public Cpu ChooseCpu();

    public Battery ChooseBattery();
}

  该生产手机的工厂类有两个实现方法,分别为生产苹果手机工厂和生产华为手机工厂:

public class ProduceApplePhoneFactory implements ProducePhoneFactory {
    @Override
    public Cpu ChooseCpu() {
        return new ApplePhoneCpu();
    }

    @Override
    public Battery ChooseBattery() {
        return new ApplePhoneBattery();
    }
}
public class ProduceHWPhoneFactory implements ProducePhoneFactory {
    @Override
    public Cpu ChooseCpu() {
        return new HWPhoneCpu();
    }

    @Override
    public Battery ChooseBattery() {
        return new HWPhoneBattery();
    }
}

  定义CPU和电池两种抽象产品角色:

一、Cpu接口与两种具体的实现如下:

public interface Cpu {
    public void Calculate();
}
public class ApplePhoneCpu implements Cpu {
    @Override
    public void Calculate() {
        System.out.println("I am ApplePhone Cpu");
    }
}
public class HWPhoneCpu implements Cpu{
    @Override
    public void Calculate() {
        System.out.println("I am HWPhone Cpu");
    }
}

二、电池接口与两种具体的实现如下:

public interface Battery {
    public void Charge();
}
public class ApplePhoneBattery implements Battery {
    @Override
    public void Charge() {
        System.out.println("I am ApplePhone Battery");
    }
}
public class HWPhoneBattery implements Battery {
    @Override
    public void Charge() {
        System.out.println("I am HWPhone Battery");
    }
}

  客户端组装手机代码如下:

public class Client {
    public static void main(String[] args) {
        System.out.println("生产苹果手机");
        ProducePhoneFactory producePhoneFactory = new ProduceApplePhoneFactory();
        producePhoneFactory.ChooseCpu().Calculate();
        producePhoneFactory.ChooseBattery().Charge();

        System.out.println("生产华为手机");
        ProducePhoneFactory producePhoneFactory1 = new ProduceHWPhoneFactory();
        producePhoneFactory1.ChooseCpu().Calculate();
        producePhoneFactory1.ChooseBattery().Charge();
    }
}

  返回结果为:

生产苹果手机
I am ApplePhone Cpu
I am ApplePhone Battery
生产华为手机
I am HWPhone Cpu
I am HWPhone Battery

 抽象工厂模式的优缺点

抽象工厂模式有如下优缺点:

  1. 抽象工厂模式分离了具体的实现类。通过上述例子我们可以看出,在客户端组装手机时,只需要实例化具体工厂角色,就能创建出对应的产品,而不需要关注产品的创建、组合过程。
  2. 抽象工厂模式易于交换产品序列。在客户端代码中如果要创建不同的产品只需要改变具体的工厂即可使用不同的产品配置,这样在生产产品的过程中修改了极少量的代码就可以生产不同的产品序列出来。
  3. 它有利于产品的一致性。由于苹果手机只能接受苹果手机Cpu和苹果手机电池而不能接受华为手机的Cpu和电池,在抽象工厂模式中能够完全限定苹果手机Cpu和苹果手机电池相搭配,而不用担心生产出来的产品兼容性不符。
  4. 抽象工厂模式难以支持新的产品类型。由上图的例子所示,如果要新增主板这个产品,则必须要修改抽象工厂类以及所有实现抽象工厂类的具体工厂类,所以在最初设计抽象工厂类的时候就要考虑好具体有哪些产品。
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄