您的位置:首页 > 其它

设计模式-抽象工厂模式

2016-12-19 11:29 169 查看

一、定义

抽象工厂模式(Abstract Factory Pattern)是一种比较常见的模式,其定义如下:

Provide an interface for creating families of related or dependent objects without specifying their concrete classes.(为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。)

抽象工厂模式的通用类图为:



//抽象产品类
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的实现方法");
}
}

//抽象工厂类
public abstract class AbstractCreator {
public abstract AbstractProductA createProductA();

public abstract AbstractProductB createProductB();
}

//产品等级1的实现类
public class Creator1 extends AbstractCreator {
public AbstractProductA createProductA {
return new ProductA1();
}

public AbstractProductB createProductB() {
return new ProductB1();
}
}

//产品等级2的实现类
public class Creator2 extends AbstractCreator{
public AbstractProductA createProductA() {
return new ProductA2();
}

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


注意:有M个产品就应该有M个实现工厂类,在每个实现工厂中,实现不同产品族的生成任务。

public class Client {
public static void main(String[] args) {
AbstractCreator creator1 = new Creator1();
AbstractCreator creator2 = new Creator2();

AbstractProductA a1 = creator1.createProductA();
AbstractProductA a2 = creator2.createProductA();
AbstractProductB b1 = creator1.createProductB();
AbstractProductB b2 = creator2.createProductB();
}
}


二、应用

2.1 优点

封装性,每个产品的实现类不是高层模块要关心的,他要关心的是接口,是抽象,他不关心对象是如何创建出来。这是由工厂类负责的,只要知道工厂类是谁,我就能创建出一个需要需要的对象。

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

2.2 缺点

最大缺点就是产品族扩展非常困难。如果我们要增加一个产品,抽象类AbstractCreator要增加一个方法,然后两个实现类都要修改,这违背了开闭原则。

2.3 使用场景

一个对象族(或是一组没有任何关系的对象)都有相同的约束,就可以使用抽象工厂模式。例如一个文本编辑器和一个图片处理器,都是软件实体。但是*nixd下的文本编辑器和windows下的文本编辑器虽然功能和界面都相同,但是代码实现不同,图片处理器也有类似情况。也就是具备了相同的约束条件:操作系统类型。于是我们可以使用抽象工厂模式,产生不同操作系统下的编辑器和图片处理器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式