设计模式之抽象工厂模式

一、抽象工厂模式

抽象工厂模式(Abstract Factor Pattern)是创建型设计模式之一。它和之前的工厂设计模式很像。之前的工厂设计模式中如果一个工厂只能生产一种它具体的产品。而抽象工厂设计模式可以用一个工厂类生产一系列相关的产品。

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

二、UML类图
7911186-aa08f03a08346c5e.png
抽象工厂模式uml.png
三、实例解读

下面笔者用一个手机生产商生产手机配件的示例来解读上面这个类图。
具体数据都是乱编的,不要过于纠结[啧啧啧]

1.手机工厂用于生产屏幕和处理器两种配件 -对应类图的AbstractFactory

public abstract class PhoneFacory {
    public abstract ICpu createCpu();
    public abstract IScreen createScreen();
}

2.处理器和屏幕的接口 --分别对应类图的 AbstractProduct1 和 AbstractProduct2

public interface ICpu {
    void cpu();
}

public interface IScreen {
    void sreen();
}

3.具体的处理器和屏幕 --对应 ConcreteProduct1 和 ConcreteProduct1

public class GaoTongCpu implements ICpu {
    @Override
    public void cpu() {
        System.out.println("高通骁龙处理器");
    }
}

public class QiLingCpu implements ICpu {
    @Override
    public void cpu() {
        System.out.println("麒麟处理器");
    }
}

public class ShengHuaScreen implements IScreen {
    @Override
    public void sreen() {
        System.out.println("胜华屏幕");
    }
}

public class KangNingSreeen implements IScreen {
    @Override
    public void sreen() {
        System.out.println("康宁大猩猩玻璃");
    }
}

4.具体的手机生产商 --对应类图的 ConcreteFactory1 和 ConcreteFactory2

public class XiaoMiFactory extends PhoneFacory{
    @Override
    public ICpu createCpu() {
        return new QiLingCpu();
    }
    @Override
    public IScreen createScreen() {
        return new KangNingSreeen();
    }
}


public class IphoneFactory extends PhoneFacory{

    @Override
    public ICpu createCpu() {
        return new GaoTongCpu();
    }

    @Override
    public IScreen createScreen() {
        return new ShengHuaScreen();
    }
}

5.用一个客户端类生产产品

public class Client {
    public static void main(String[] args) {
        PhoneFacory phoneFacory = new XiaoMiFactory();
        phoneFacory.createCpu().cpu();;
        phoneFacory.createScreen().sreen();;
        
        System.out.println("------------");
        
        PhoneFacory phoneFacory2=new IphoneFactory();
        phoneFacory2.createCpu().cpu();;
        phoneFacory2.createScreen().sreen();;
    }
}

运行结果:

麒麟处理器
康宁大猩猩玻璃
------------
高通骁龙处理器
胜华屏幕

从Client类可以看出并没有用到具体的产品类,而是用一个具体工厂把这两个有相关性的产品封装起来,而这个具体的工厂,也用了一个抽象类抽象出来,最终只需要创建这个抽象类的对象就能生产一系列的产品了。

四、总结

它的一个显著的优点是分离接口与实现,客户端使用抽象工厂创建需要的对象时不需要具体的实现是谁,把具体的产品解耦出去,使在切换产品类是更加灵活和容易。但它也有一个明显的缺点,不太容易扩展新的类,因为添加一个产品类就需要修改抽象工厂和对应的具体工厂,并且这还会导致文件类的增加较多。所以在实际使用时要权衡利弊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值