您的位置:首页 > 其它

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

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 的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: