Skip to content

抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。

抽象工厂模式又称为 Kit 模式,属于对象创建型模式。

示意图

Abstract Factory Pattern

示意代码

以奶茶为例,我们想制作不同类型的奶茶,比如 BubbleTea、FruitTea,它们可能属于不同的品牌,比如 Mixue、HEYTEA。每个品牌都有自己的制作方法。

typescript
interface BubbleTea {
    makeBubbleTea(): string;
}

interface FruitTea {
    makeFruitTea(): string;
}

class MixueBubbleTea implements BubbleTea {
    public makeBubbleTea() {
        return 'Mixue Bubble Tea';
    }
}

class HEYTEABubbleTea implements BubbleTea {
    public makeBubbleTea() {
        return 'HEYTEA Bubble Tea';
    }
}

class MixueFruitTea implements FruitTea {
    public makeFruitTea() {
        return 'Mixue Fruit Tea';
    }
}

class HEYTEAFruitTea implements FruitTea {
    public makeFruitTea() {
        return 'HEYTEA Fruit Tea';
    }
}

interface DrinkFactory {
    createBubbleTea(): BubbleTea;
    createFruitTea(): FruitTea;
}

class MixueDrinkFactory implements DrinkFactory {
    public createBubbleTea() {
        return new MixueBubbleTea();
    }

    public createFruitTea() {
        return new MixueFruitTea();
    }
}

class HEYTEADrinkFactory implements DrinkFactory {
    public createBubble Tea() {
        return new HEYTEABubbleTea();
    }

    public createFruitTea() {
        return new HEYTEAFruitTea();
    }
}

// usage
function makeDrink(factory: DrinkFactory) {
    const bubbleTea = factory.createBubbleTea();
    const fruitTea = factory.createFruitTea();
}
interface BubbleTea {
    makeBubbleTea(): string;
}

interface FruitTea {
    makeFruitTea(): string;
}

class MixueBubbleTea implements BubbleTea {
    public makeBubbleTea() {
        return 'Mixue Bubble Tea';
    }
}

class HEYTEABubbleTea implements BubbleTea {
    public makeBubbleTea() {
        return 'HEYTEA Bubble Tea';
    }
}

class MixueFruitTea implements FruitTea {
    public makeFruitTea() {
        return 'Mixue Fruit Tea';
    }
}

class HEYTEAFruitTea implements FruitTea {
    public makeFruitTea() {
        return 'HEYTEA Fruit Tea';
    }
}

interface DrinkFactory {
    createBubbleTea(): BubbleTea;
    createFruitTea(): FruitTea;
}

class MixueDrinkFactory implements DrinkFactory {
    public createBubbleTea() {
        return new MixueBubbleTea();
    }

    public createFruitTea() {
        return new MixueFruitTea();
    }
}

class HEYTEADrinkFactory implements DrinkFactory {
    public createBubble Tea() {
        return new HEYTEABubbleTea();
    }

    public createFruitTea() {
        return new HEYTEAFruitTea();
    }
}

// usage
function makeDrink(factory: DrinkFactory) {
    const bubbleTea = factory.createBubbleTea();
    const fruitTea = factory.createFruitTea();
}

优缺点

优点

  • 封装性好,在增加新的产品系列时不需要修改抽象层代码。
  • 扩展性高,在增加新产品族时只需要添加一个工厂类即可。

缺点

  • 难以应对“新对象”的需求变动(在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品)。

使用场景

  • 当系统中有多个产品族,并且各产品族在特定系列下的对象之间有相互依赖、或作用的关系,产品族之间可以相互独立变化时;
  • 抽象工厂模式主要在于应对“新系列”的需求变动。

Developed by Kisstar & Powered by VitePress.