设计模式(五)——抽象工厂模式
2016-08-24 22:38
169 查看
概述
抽象工厂模式(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 的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)
相关文章推荐
- 设计模式(2)-抽象工厂模式(Abstract Factory)与生成器模式(Builder)模式
- 设计模式(创建型)之抽象工厂模式(Abstract Factory Pattern)
- 设计模式(三): 抽象工厂模式
- 《设计模式》-- 抽象工厂模式
- 设计模式初学者系列-开篇以及抽象工厂模式
- 设计模式C++学习笔记之六(AbstractFactory抽象工厂模式)
- 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)
- 设计模式系列之三:抽象工厂模式
- 设计模式Before-after之抽象工厂模式
- 设计模式(抽象工厂模式)
- 《设计模式》学习笔记4——抽象工厂模式
- 《每日编程》----《设计模式》----《一》----工厂方法模式和抽象工厂模式
- 设计模式(JAVA)------抽象工厂模式
- 设计模式(对象创建)——抽象工厂模式
- 设计模式入门之抽象工厂模式
- 《设计模式》学习笔记(4)——抽象工厂模式(Abstract Factory)
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
- 《设计模式》笔记之抽象工厂模式
- 设计模式系列(五)——抽象工厂模式
- 设计模式(五)抽象工厂模式详解