抽象工厂方法模式

定义

抽象工厂模式(Abstract Factory Pattern),又称工具箱模式(Kit/Toolkit):为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类,封装了变化,隔离了变化,让客户端代码变得稳定。

类图及角色

在这里插入图片描述
抽象工厂:抽象工厂方法的核心,接口或者抽象类。与系统的商业逻辑无关。
具体工厂:同类图上注释。
抽象产品:抽象工厂方法模式所创建的对象的父类,或者它们共同拥有的接口。
具体产品:客户端需要的东西,抽象工厂模式所创建的任何产品对象都是某具体产品的实例。

使用
  1. 系统不依赖于产品类的细节。
  2. 系统只消费产品族中的一族产品。
  3. 所有的产品族以相同的接口出现。
优点
  1. 产品从客户端代码中分离出来。
  2. 容易改变产品的系列。
  3. 将一个系列的产品族统一到一起创建。
缺点

在产品族中扩展新的产品是很困难的,它需要修改抽象工厂的接口。

产品等级和产品族

产品等级:即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。

产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、海尔电冰箱构成了一个产品族。

工厂模式和抽象工厂模式的区别
用抽象工厂来定义具体工厂的抽象,而由具体工厂来创建对象。抽象工厂模式是工厂方法模式的升级版,它用来创建一组相关或者相互依赖的对象。
  它与工厂方法模式的区别在于:工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品等级结构,表现为一个接口或抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类,如上图中的ProductA和ProductB。

//抽象工厂,返回产品的类型(A和B是两种关联产品(鸡腿和可乐))
public interface AbstractFactory {
	/**
	 * 创建产品A
	 * @return
	 */
	public AbstractProductA createProductA();
	
	/**
	 * 创建产品B
	 * @return
	 */
	public AbstractProductB createProductB();
}

//公共的产品接口,可以理解为抽象的鸡腿
public interface AbstractProductA {}

//公共的产品接口,可以理解为抽象的可乐
public interface  AbstractProductB {}

//具体工厂,生产鸡腿和可乐的套餐(德克士)
public class ConcreteFactory1 implements AbstractFactory {

	@Override
	public AbstractProductA createProductA() {
		// TODO Auto-generated method stub
		return new ProductA1();
	}

	@Override
	public AbstractProductB createProductB() {
		// TODO Auto-generated method stub
		return new ProductB1();
	}

}
//具体工厂,生产鸡腿和可乐的套餐(肯德基)
public class ConcreteFactory2 implements AbstractFactory {

	@Override
	public AbstractProductA createProductA() {
		return new ProductA2();
	}

	@Override
	public AbstractProductB createProductB() {
		return new ProductB2();
	}

}
//分别生产的工厂,这里理解为德克士的鸡腿
public class ProductA1 implements AbstractProductA {}

//分别生产的工厂,这里理解为肯德基的鸡腿
public class ProductA2 implements AbstractProductA {}

//分别生产的工厂,这里理解为德克士的可乐
public class ProductB1 implements AbstractProductB {}

//分别生产的工厂,这里理解为肯德基的可乐
public class ProductB2 implements AbstractProductB {}

上一篇: 工厂方法模式
下一篇: 原型模式

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值