23种设计模式系列目录

23种设计模式之单例模式(Singleton Pattern)

23种设计模式之代理模式(Proxy Pattern)

23种设计模式之适配器模式(Adapter Pattern)

23种设计模式之工厂模式(Factory Pattern)

23种设计模式之抽象工厂模式(Abstract Factory Pattern)

23种设计模式之装饰器模式(Decorator Pattern)

--------------------------------------------------------------------------------------------------------------------------

读完本篇文章将会了解以下问题

1. 抽象工厂模式定义

2. 抽象工厂模式代码实现

3. 抽象工厂模式的优缺点分析

4. 抽象工厂模式使用场景

--------------------------------------------------------------------------------------------------------------------------

1. 抽象工厂模式定义

       抽象工厂模式(Abstract  Factory Pattern)是围绕一个超级工厂创建其他工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

       目的:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

       何时使用:系统的产品有多于一个的产品族(包含一组互相有关联产品的集合),而系统只消费其中某一族的产品。

       如何解决:在一个产品族接口内定义多个产品,由对应的工厂去生产一个产品族内的一系列产品。

       关键代码:在一个工厂里聚合多个同系列的产品。

2. 抽象工厂模式代码实现

整体类图:

抽象工厂模式(Abstract Factory Pattern)_ide

Keybo:键盘抽象类

public abstract class Keybo {
    public abstract void light();
}

HpKeyBo:惠普键盘类

public class HpKeyBo extends Keybo{
    @Override
    public void light() {
        System.out.println("HpKeyBo:light");
    }
}

HpKeyBo:联想键盘类

public class LenovoKeyBo extends Keybo{
    @Override
    public void light() {
        System.out.println("LenovoKeyBo:light");
    }
}

Mouse:鼠标抽象类

public abstract class Mouse {
    public abstract void light();
}

HpMouse:惠普鼠标类

public class HpMouse extends Mouse{
    @Override
    public void light() {
        System.out.println("HpMouse:light");
    }
}

LenovoMouse:联想鼠标类

public class LenovoMouse extends Mouse{
    @Override
    public void light() {
        System.out.println("LenovoMouse:light");
    }
}

Factory:工厂抽象类

public abstract class Factory{
    /**
     * 工厂的抽象方法,由具体的工厂类去实现
     */
    public abstract Mouse createMouse();
    public abstract Keybo createKeybo();
}

HpFactory:惠普工厂类(只生产惠普的键盘和鼠标)

public class HpFactory extends Factory{
    @Override
    public Mouse createMouse() {
        return new HpMouse();
    }
    @Override
    public Keybo createKeybo() {
        return new HpKeyBo();
    }
}

LenovoFactory:联想工厂类(只生产联想的键盘和鼠标)

public class LenovoFactory extends Factory{
    @Override
    public Mouse createMouse() {
        return new LenovoMouse();
    }
    @Override
    public Keybo createKeybo() {
        return new LenovoKeyBo();
    }
}

测试方法:

public class practice {
    public static void main(String[] args) {
        Factory hpFactory = new HpFactory();
        Factory lenovoFactory = new LenovoFactory();
        hpFactory.createKeybo().light();
        hpFactory.createMouse().light();
        lenovoFactory.createKeybo().light();
        lenovoFactory.createMouse().light();
    }
}

3. 抽象工厂模式的优缺点分析

抽象工厂模式的优点:

       1、可以在类的内部对产品族进行约束,当一个产品族中的多个对象被设计成一起工作时,该设计模式可以保证客户端始终只使用同一个产品族中的对象。

抽象工厂模式的缺点:

       1、产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象层增加代码,又要在具体实现层中增加代码。

4. 抽象工厂模式使用场景

       1、同一个品牌下的电脑配件(惠普只能装惠普自己家系列产品的配件)

       2、网游游戏中的套装,一整套套装才能触发效果,所以需要每次换装一整套一整套的换