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

定义: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类产品实例的抽象创建方法,此时将要对所有抽象工厂的子类进行改写,这个也是比较麻烦的。
应用环境:这个也很明显,就是应用于在需要创建明确几组对象的时候。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值