设计模式(五)——抽象工厂模式

概述

抽象工厂模式(Abstract Factory Pattern)是工厂方法模式的进一步抽象,其英文原话"Provide an interface for creating families of related or dependent objects without specifying their concrete classes",翻译,“为创建一组相关或相互依赖的对象提供一个借口,无需指定它们的具体类”。抽象工厂模式通常是用于创一族产品,并且这族产品分不同的等级;不同的具体工厂类生产不同等级的一族产品。抽象工厂模式也有四种角色:抽象工厂、具体工厂、抽象产品和具体产品。


通用类图



两个概念:

1. 产品族:A和B同一类产品<继承自同一个抽象类>   有N个产品族,在抽象工厂类中就有N个创建方法;

2.产品等级:1和2 位产品等级 <同一个产品对应不同等级>

实现类



产品抽象类:

public abstract class AbstractProductA {

	public abstract void doSth();
}
public abstract class AbstractProductB {
    public abstract void doSth();
}
实现类<只写了一个,都一样>

public class ProductA1 extends AbstractProductA{
	@Override
	public void doSth() {
		System.out.println("生产产品A1");
	}
}
抽象工厂<有几个实现类即几个产品族就有几个方法>
public abstract class AbstractCreator {

	public abstract AbstractProductA creatProductA();
	public abstract AbstractProductB creatProductB();
}

抽象工厂实现<只写一个>

public class Creator1 extends AbstractCreator {

	@Override
	public AbstractProductA creatProductA() {
		return new ProductA1();
	}

	@Override
	public AbstractProductB creatProductB() {
		return new ProductB1();
	}

}

测试类

public class Client {

	public static void main(String[] args) {
		AbstractCreator c1 = new Creator1();
		AbstractCreator c2 = new Creator2();

		AbstractProductA a1 = c1.creatProductA();
		AbstractProductA a2 = c2.creatProductA();

		AbstractProductB b1 = c1.creatProductB();
		AbstractProductB b2 = c2.creatProductB();

		a1.doSth();
		a2.doSth();
		b1.doSth();
		b2.doSth();
	}
}

结果

生产产品A1
生产产品A2
生产产品B1
生产产品B2

在场景类中,没有任何一个方法与实现类有关系,对于一个产品来说,只需要知道它的工厂方法就可以直接生成对象,无需关系其实现类。


缺点

产品族的扩展非常困难,如果要增加一个产品C,那么抽象工厂要新增一个产品C的方法,所有实现类都要修改,违反了开闭原则。


注意是产品族扩展困难,而不是产品等级,该模式下,扩展产品等级是很容易的事情,增加一个产品等级,只需要增加一个工厂类负责新增加出来的产品生成任务即可,从这个角度来看,也算符合开闭原则了。


最佳实践

在软件开发过程中,设计不同操作系统的时候,可以考虑用此模式,例如一个应用,在windows、linux、android上运行,就可以通过抽象工厂模式屏蔽掉操作系统对应用的影响,三个不同的操作系统上的软件功能,界面应用逻辑类似,只是调用不同的工厂方法,由不同的产品类去处理与操作系统交互的信息。

QQ 换皮肤,一整套一起换。有商务装(成套,一系列具体产品)、时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装、商务男装、时尚女装、时尚男装,这些也都是成套的,即一系列具体产品。假设一种情况(现实中是不存在的,要不然,没法进入共产主义了,但有利于说明抽象工厂模式),在您的家中,某一个衣柜(具体工厂)只能存放某一种这样的衣服(成套,一系列具体产品),每次拿这种成套的衣服时也自然要从这个衣柜中取出了。用 OO 的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值