本文介绍抽象工厂架构思想,着重描述它的关注方向,并与简单工厂、工厂方法模式进行比较
简介
抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。
抽象工厂模式可以向客户端提供一个接口,是的客户端在不必指定产品具体类型的情况下,能够创建多个产品族的产品对象
产品族和产品等级结构
角色与职责
- 抽象工厂角色(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 汪汪!!
简单说明案例
动物被划分为狗和猫两类产品,每类具体动物又被细分了类别-东西方狗猫。当我们需要西方狗猫就找西方动物生产(现实中应该叫外贸公司)工厂来生产需要的动物。
优缺点探讨
- 当我们又需要美洲的狗猫时,只需要按照工厂规范再建造一个美洲动物工厂产品链即可。这是一个二级分类上的优势,也是抽象工厂模式的最主要优点之一。
- 而当我们有了新动物产品如鸽子。那么我们就需要修改所有之前的产品链中的生产方法(增加一个生产鸽子的方法)。这是它的一个缺点
与简单工厂/工厂方法模式区别
- 简单工厂和工厂方法着重关注的是产品快速的生产
- 抽象工厂关注的是一个供应链/产品链,更多的是产品层级结构上的抽象
可查看: