设计模式之抽象工厂模式

定义

为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。
抽象工厂模式是工厂模式的升级版
举个栗子:
以工厂模式中的例子继续:
定义一个产品接口(也可以是抽象类),

//产品接口
public interface Product {
    void method1();
}

两个产品抽象子类实现这个接口,每个产品子类中有不同的抽象方法

//抽象产品类A
public abstract class AbstractProductA implements Product {
    @Override
    public void method1() {

    }
    public abstract void method2();
}
//抽象产品类B
public abstract class AbstractProductB implements Product {
    @Override
    public void method1() {

    }
    public abstract void method2();
}

每个产品抽象类有不同的子类实现类

//产品类A的实现类A1
public class ProductA1 extends AbstractProductA {
    @Override
    public void method2() {
        System.out.println("ProductA1的实现方法");
    }
}

//产品类A的实现类A2
public class ProductA2 extends AbstractProductA {
    @Override
    public void method2() {
        System.out.println("ProductA2的实现方法");
    }
}
//产品类B的实现类B1
public class ProductB1 extends AbstractProductB {
    @Override
    public void method2() {
        System.out.println("ProductB1的实现方法");
    }
}

//产品类A的实现类B2
public class ProductB2 extends AbstractProductB {
    @Override
    public void method2() {
        System.out.println("ProductB2的实现方法");
    }
}

定义一个抽象工厂,用来创建产品A和产品B

public abstract class AbstractFactory {
    //创建产品A家族
    public abstract AbstractProductA createProductA();

    //创建产品B家族
    public abstract AbstractProductB createProductB();
}

接下来定义两个抽象工厂的实现类,分别用来创建1(A1、B1)和2(A2、B2)产品

public class Factory1 extends AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ProductA1();
    }

    @Override
    public AbstractProductB createProductB() {
        return new ProductB1();
    }
}
public class Factory2 extends AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ProductA2();
    }

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

接下来通过客户端场景类进行调用:

public class Client {
    public static void main(String[] args) {
        Factory1 factory1 = new Factory1();
        Factory2 factory2 = new Factory2();

        AbstractProductA productA1 = factory1.createProductA();
        AbstractProductA productA2 = factory2.createProductA();

        AbstractProductB productB1 = factory1.createProductB();
        AbstractProductB productB2 = factory2.createProductB();
    }
}

在客户端场景类中,所有的方法与实现类都没有关系,也就是说只需要知道它的工厂方法就可以创建一个对象,不需要关心它的实现类

优缺点

优点
* 封装性,高层模块只需要关心抽象,不需要关心每个产品的实现类,只要知道工厂是谁就可以创建出对象
* 产品族内的约束为非公开状态。生产过程对于高层模块来说是透明的,在具体产品族内的约束它是不需要知道的,这个约束是在工厂内实现的。

缺点
产品族纵向扩展困难,比如增加一个ProductC,程序改动较大,AbstractFactory需要增加一个方法,两个实现类工厂需要修改。而横向扩展是比较容易的,比如增加一个等级3,只需要增加一个工厂类即可

应用场景

当一个对象族(或是一组没有任何关系的对象)都有相同的约束,就可以使用抽象工厂模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值