JAVA23种设计模式之工厂模式(三)

抽象工厂模式
3.1. 定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
3.2. 抽象工厂类图如下:
抽象工厂模式
从上图可以看出,抽象工厂方法允许有一个最顶层的工厂接口或者抽象工厂类,该类下可以有多个不同的工厂,如factory1,factory2等等。工厂1和2都能生产一系列的产品A和B,但是工厂1和工厂2生产的A和B都是相互独立的。举个例子,以手机为例,productA表示手机的处理器,A1表示安卓的骁龙系列处理器,A2表示苹果的A系列处理器(eg:A12…);productB表示数据线,B1表示安卓的Type-c数据线,B2表示苹果的lighting数据线.在这种前提下,安卓和苹果的相关数据线和处理器是无法混用的,如果使用苹果的处理器,我们就只能使用苹果的数据线。(例子可能有些不恰当,勉强看看-)。
3.3. 按照以上场景代码实例如下:
产品的抽象类:
cpu:

public interface Cpu {
    void cup();
}

数据线:

public interface DataWire {
    void dataWire();
}

具体产品类:
安卓类cpu和数据线:

public class AndroidCpu implements Cpu {
    @Override
    public void cup() {
        System.out.println("-----------Android Cpu--------");
    }
}
public class AndroidDataWire implements DataWire {
    @Override
    public void dataWire() {
        System.out.println(">>>>>>>>>安卓数据线<<<<<<<<<<<<<<<");
    }
}

苹果类Cpu和数据线:

public class AppleCpu implements Cpu {
    @Override
    public void cup() {
        System.out.println("---------------Apple Cpu------------");
    }
}
public class AppleDataWire  implements DataWire{
    @Override
    public void dataWire() {
        System.out.println(">>>>>>>>>>苹果数据线<<<<<<<<<");
    }
}

抽象工厂类:

public interface AbsFactory {
    DataWire productDataWire();
    Cpu productCpu();
}

具体工厂类:
安卓工厂:

public class AndroidFactory  implements AbsFactory {
    @Override
    public DataWire productDataWire() {
        return new AndroidDataWire();
    }
    @Override
    public Cpu productCpu() {
        return new AndroidCpu();
    }
}

苹果工厂:

public class AppleFactory implements AbsFactory {
    @Override
    public DataWire productDataWire() {
        return new AppleDataWire();
    }
    @Override
    public Cpu productCpu() {
        return new AppleCpu();
    }
}

测试主函数:

public class Main {
    public static void main(String[] args) {
        AbsFactory factory = null;
        factory = new AndroidFactory();
        factory.productCpu().cup();
        factory.productDataWire().dataWire();
        System.out.println("=========================================");
        factory = new AppleFactory();
        factory.productCpu().cup();
        factory.productDataWire().dataWire();
    }
}

一般使用抽象工厂的情况:

  1. 同属于一个产品族的产品是一起使用的,如果上面的苹果需要使用苹果手机相关配件,安卓需要使用安卓手机相关配件。
  2. 系统有多个产品族,但是系统每次只调用一个产品族也就是一类了。
    抽象工厂的优点:
    将接口和具体实现分离,实现了一定的解耦合,客户端值需要使用抽象工厂来创建,但是不需要具体指导是哪个对象。
    从一类产品切换到另一类产品变得简单。
    当然抽象工厂模式的缺点也是很明显的,如果要给整个生产线或产品族添加一个新的产品,以上面的例子,比如手新增了一个耳机,我们知道苹果的耳机接口是lighting的和安卓的type-c又不相同。那么就需要修改抽象工厂,也就会对下面所有的工厂实现类产生影响,不利于维护。
发布了62 篇原创文章 · 获赞 8 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/system_obj/article/details/86586328