您的位置:首页 > 编程语言 > Java开发

java设计模式之抽象工厂模式

2016-09-01 11:07 507 查看
定义:Provide an interface for creating families of related or dependent objects without specifying their concrete classes. 即为一组相关或相互依赖的对象提供一个实例化接口,而且无需指定他们的具体类。说白了,相对于之前提到的工厂方法模式,抽象工厂模式在创建对象实例时无需传入任何参数,即建立起与待实例化对象的一一对象关系,而在工厂模式中createProduct(Class c)方法还需传入一个具体的Class类名,所以工厂模式可以一对多。 差别仅此而已。下面用一个例子说明:

类图:



对比工厂模式,很容易理解这种模式,废话不多说,直接上测试代码:

AbstractFactory.java

/**
* Created by Song on 2016/9/1.
* 抽象工厂类
*/
public abstract class AbstractFactory {
//创建A类产品实例
public abstract AbstractProduct createProductA();
//创建B类产品实例
public abstract AbstractProduct createProductB();
}


AbstractProduct.java

/**
* Created by Song on 2016/9/1.
* 抽象产品类
*/
public abstract class AbstractProduct {
//自我介绍
public abstract void introduction();
}


ProductA.java

/**
* Created by Song on 2016/9/1.
* A类产品
*/
public class ProductA extends AbstractProduct {
@Override
public void introduction() {
System.out.println("这是产品A");
}
}


ProductB.java

/**
* Created by Song on 2016/9/1.
* B类产品
*/
public class ProductB extends AbstractProduct {
@Override
public void introduction() {
System.out.println("这是产品B");
}
}


ConcreteFactory.java

/**
* Created by Song on 2016/9/1.
* 具体工厂实现类
*/
public class ConcreteFactory extends AbstractFactory {
@Override
public AbstractProduct createProductA() {
return new ProductA();
}

@Override
public AbstractProduct createProductB() {
return new ProductB();
}
}


测试代码:

public class Main {
public static void main(String [] args){
//创建具体工厂
AbstractFactory factory = new ConcreteFactory();
//获取产品实例
ProductA productA = (ProductA) factory.createProductA();
ProductB productB = (ProductB)factory.createProductB();

//打印产品信息
productA.introduction();
productB.introduction();
}
}


测试结果:



在这个例子中,抽象工厂方法中分别定义了创建A类产品以及B类产品实例的方法,如果还有C类产品,则在抽象工厂类中继续添加创建C类产品的方法,如果是还有A1,A2…An,B1,B2…Bn系的产品呢?则新建n个继承自抽象工厂的子类,第n个工厂实现类创建A类以及B类产品实例方法分别返回An以及Bn产品类实例。这也就是抽象工厂模式定义里提到的创建一组相关或相互依赖的对象。

优点:封装性较工厂方法模式更好一点,毕竟创建对象实例时连类名都不用知道。缺点也在于这一点,创建对象实例的方法只能是一对一的关系,导致系统的复杂性增加了。另外,如果一开始只在抽象工厂类里定义了A和B类产品创建实例的方法,后面也多了个C类产品,这时候就需要新增C类产品实例的抽象创建方法,此时将要对所有抽象工厂的子类进行改写,这个也是比较麻烦的。

应用环境:这个也很明显,就是应用于在需要创建明确几组对象的时候。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息