04-抽象工厂模式

抽象工厂模式

一、定义

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

抽象工厂方法的通用类图如下
在这里插入图片描述
抽象工厂模式是工厂方法模式的升级版本,应用于多个业务品种、业务分类产生对象的情况。

下面为通用源代码类图与其代码

通用源代码类图
在这里插入图片描述
有两个相互影响的产品线(产品族,即不同的产品,如汽车发动机和方向盘)ProductA、ProductB

,每个产品有连个登记,ProductX1、ProductX2,有2个工厂类Creator1、Creator2用于创建来个等级的产品,Creator1生产

抽象产品类ProductA1、ProductB1,所以Creator1依赖ProductA1、ProductB1,Creator2同样。

通用源码

public abstract class AbstractProductA {
	//每个产品共有的方法
	public void shareMethod(){
	}
	//每个产品相同方法,不同实现
	public abstract void doSomething();
}

产品A1的实现类

public class ProductA1 extends AbstractProductA {
	public void doSomething() {
		System.out.println("产品A1的实现方法");
	}
}

产品A2的实现方式

public class ProductA2 extends AbstractProductA {
	public void doSomething() {
		System.out.println("产品A2的实现方法");
	}
}

产品B与A类似

抽象工厂类AbstractCreator的职责是定义每个工厂要实现的功能

public abstract class AbstractCreator {
	//创建A产品家族
	public abstract AbstractProductA createProductA();
	//创建B产品家族
	public abstract AbstractProductB createProductB();
}

等级为1的工厂类

public class Creator1 extends AbstractCreator {
	//只生产产品等级为1的A产品
	public AbstractProductA createProductA() {
		return new ProductA1();
	}
	//只生产产品等级为1的B产品
	public AbstractProductB createProductB() {
		return new ProductB1();
	}
}

等级为2的工厂类

public class Creator2 extends AbstractCreator {
	//只生产产品等级为2的A产品
	public AbstractProductA createProductA() {
		return new ProductA2();
	}
	//只生产产品等级为2的B产品
	public AbstractProductB createProductB() {
		return new ProductB2();
	}
}

与实现无关的场景类Client

public class Client {
	public static void main(String[] args) {
		//定义出两个工厂
		AbstractCreator creator1 = new Creator1();
		AbstractCreator creator2 = new Creator2();
		//产生A1对象
		AbstractProductA a1 = creator1.createProductA();
		//产生A2对象
		AbstractProductA a2 = creator2.createProductA();
		//产生B1对象
		AbstractProductB b1 = creator1.createProductB();
		//产生B2对象
		AbstractProductB b2 = creator2.createProductB();
		/*
		* 然后在这里就可以为所欲为了...
		*/
	}
}

在场景类中,没有任何一个方法与实现类有关系,我们只要知道它的工厂方法就可以直接产生一个产品对象,无须关心它的实现类。

二、抽象工厂的优点

  • 封装性

    高层模块不需要关心每个产品的实现类,只要知道哪个工厂类能创建出一个需要的对象即可

  • 产品族内的约束为非公开状态

    例如一个发动机对应一个方向盘,但需要对应四个轮子,具体的产品族内的约束是在工厂内实现的。

三、抽象工厂的缺点

  • 产品族扩展困难

    如上面要增加一个产品C,则需要在抽象类AbstractCreator增加一个createProductC(),然后两个工厂实现类都需要修改,所有与契约有关系的代码都要修改。

    其实上面与现实相似,比如说一个工厂有两个电脑生产工厂,生产电脑外壳和电池,现在老板要扩展生产线,生产电脑蓝牙设备,那么每个工厂都要添加生产蓝牙设备的车间(生产方法),这样一个工厂产出的物品才是完整地(在一个工厂需要产出组合完整地产品的前提下)

四、使用场景

一个对象族都有相同的约束,就可以使用抽象工厂模式。

生产工厂,生产电脑外壳和电池,现在老板要扩展生产线,生产电脑蓝牙设备,那么每个工厂都要添加生产蓝牙设备的车间(生产方法),这样一个工厂产出的物品才是完整地(在一个工厂需要产出组合完整地产品的前提下)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值