设计模式与应用:抽象工厂模式

本文介绍抽象工厂架构思想,着重描述它的关注方向,并与简单工厂、工厂方法模式进行比较

简介

抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。

抽象工厂模式可以向客户端提供一个接口,是的客户端在不必指定产品具体类型的情况下,能够创建多个产品族的产品对象

产品族和产品等级结构

这里写图片描述

角色与职责

  • 抽象工厂角色(Create):抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
  • 具体工厂(concrete Creator):具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
  • 抽象角色(Product):抽象模式所创建的所有对象的父类,他负责描述所有实例所有公共接口
  • 具体产品角色(Concrete Product):抽象模式所创建的具体实例对象。

实现

这里写图片描述

产品定义

顶级产品抽象

package com.mym.designmodel.abstractFactory;

/**
 * 职责:product 抽象产品角色
 */
public interface Animal {

    public void shout();//定义动物的喊叫方法
}

产品抽象分类1

package com.mym.designmodel.abstractFactory;

/**
 * 职责:concreteProduct 具体产品族
 */
public abstract class Cat implements Animal {

    @Override
    public abstract void shout();
}

产品抽象分类2

package com.mym.designmodel.abstractFactory;

/**
 * 职责:concreteProduct 具体产品族
 */
public abstract class Dog implements Animal {
    @Override
    public abstract void shout();
}

具体产品1(对应各自的抽象分类)

package com.mym.designmodel.abstractFactory;

/**
 * 职责:具体产品角色(Concrete Product)
 */
public class EastCat extends Cat {
    @Override
    public void shout() {
        System.out.println("east cat 喵喵!");
    }
}

具体产品2(对应各自的抽象分类)

package com.mym.designmodel.abstractFactory;

/**
 * 职责:具体产品角色(Concrete Product)
 */
public class EastDog extends Dog {
    @Override
    public void shout() {
        System.out.println("east dog 汪汪!!");
    }
}

具体产品3(对应各自的抽象分类)

package com.mym.designmodel.abstractFactory;

/**
 * 职责:具体产品角色(Concrete Product)
 */
public class WestCat extends Cat {
    @Override
    public void shout() {
        System.out.println("west cat 喵喵!");
    }
}

具体产品4(对应各自的抽象分类)

package com.mym.designmodel.abstractFactory;

/**
 * 职责:具体产品角色(Concrete Product)
 */
public class WestDog extends Dog {
    @Override
    public void shout() {
        System.out.println("west dog 汪汪!!");
    }
}

工厂定义

顶级抽象工厂

package com.mym.designmodel.abstractFactory;

/**
 * 职责:Creator 抽象工厂角色
 */
public interface AnimalFactory {

    //定义生产的产品族方法
    public Animal getCat();

    public Animal getDog();
}

产品链工厂1

package com.mym.designmodel.abstractFactory;

/**
 * 职责:具体工厂(concrete Creator)具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
 */
public class EastAnimalFactory implements AnimalFactory{
    @Override
    public Animal getCat() {
        return new EastCat();
    }

    @Override
    public Animal getDog() {
        return new EastDog();
    }
}

产品链工厂2

package com.mym.designmodel.abstractFactory;

/**
 * 职责:具体工厂(concrete Creator)具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
 */
public class WestAnimalFactory implements AnimalFactory{
    @Override
    public Animal getCat() {
        return new WestCat();
    }

    @Override
    public Animal getDog() {
        return new WestDog();
    }
}

测试

package com.mym.designmodel.abstractFactory;

/**
 * 测试
 */
public class MainClass {

    public static void main(String[] args) {
        AnimalFactory eastAnimalFactory = new EastAnimalFactory();
        eastAnimalFactory.getCat().shout();
        eastAnimalFactory.getDog().shout();

        System.out.println("------------------------------");

        WestAnimalFactory westAnimalFactory = new WestAnimalFactory();
        westAnimalFactory.getCat().shout();
        westAnimalFactory.getDog().shout();
    }

}

执行输出:

east cat 喵喵!
east dog 汪汪!!
------------------------------
west cat 喵喵!
west dog 汪汪!!

简单说明案例

动物被划分为狗和猫两类产品,每类具体动物又被细分了类别-东西方狗猫。当我们需要西方狗猫就找西方动物生产(现实中应该叫外贸公司)工厂来生产需要的动物。

优缺点探讨

  • 当我们又需要美洲的狗猫时,只需要按照工厂规范再建造一个美洲动物工厂产品链即可。这是一个二级分类上的优势,也是抽象工厂模式的最主要优点之一。
  • 而当我们有了新动物产品如鸽子。那么我们就需要修改所有之前的产品链中的生产方法(增加一个生产鸽子的方法)。这是它的一个缺点

与简单工厂/工厂方法模式区别

  • 简单工厂和工厂方法着重关注的是产品快速的生产
  • 抽象工厂关注的是一个供应链/产品链,更多的是产品层级结构上的抽象

可查看:

猜你喜欢

转载自blog.csdn.net/maoyuanming0806/article/details/80214685