03-抽象工厂模式

目录

一 什么是抽象工厂模式

二 什么场景适合使用抽象工厂模式

三 抽象工厂模式的使用示例

3.1 抽象工厂的结构和说明

3.2 抽象工厂代码实现

四 抽象工厂模式的思考

4.1 抽象工厂的优点

4.2 抽象工厂的缺点

4.3 抽象工厂模式和简单工厂模式的对比

4.4 抽象工厂模式和单例模式的联系

 


一 什么是抽象工厂模式

       提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

二 什么场景适合使用抽象工厂模式

  • 系统只知道产品的接口,而不关心实现。
  • 系统要由多个产品系列中的一个来配置的时候。也就是说,可以动态地切换产品簇。
  • 要联合使用一系列相关产品的接口。

三 抽象工厂模式的使用示例

3.1 抽象工厂的结构和说明

  • AbstractFactory:抽象工厂,定义创建一系列产品对象的操作接口。
  • ConcreteFactory:具体的工厂,实现抽象工厂定义的方法,具体实现一系列产品对象的创建。
  • AbstractProduct:定义一类产品对象的接口。
  • Concrete Product:具体的产品实现对象,通常在具体工厂里面,会选择具体的产品实现对象,来创建符合抽象工厂定义的方法返回的产品类型的对象。
  • Client:客户端,主要使用抽象工厂来获取一系列所需要的产品对象,然后面向这些产品对象的接口编程,以实现需要的功能。

3.2 抽象工厂代码实现

(1)抽象工厂代码:

/**
 * 抽象工厂的接口
 */
public interface AbstractFactory {
    /**
     * 创建抽象产品A的对象
     * @return 抽象产品A的对象
     */
    public AbstractProductA createProductA();

    /**
     * 创建抽象产品B的对象
     * @return 抽象产品B的对象
     */
    public AbstractProductB createProductB();
    
}

(2)产品定义:

/**
 * 抽象产品A的接口
 */
public interface AbstractProductA {
    //定义抽象产品A相关的操作
}


/**
 * 抽象产品B的接口
 */
public interface AbstractProductB {
    //定义抽象产品B相关的操作
}

(3)产品的各个实现

产品A的实现

/**
 * 产品A的具体实现
 */
public class ProductA1 implements AbstractProductA {
    //定义产品A的接口中定义的操作
}

/**
 * 产品A的具体实现
 */
public class ProductA2 implements AbstractProductA {
    //定义产品A的接口中定义的操作
}

产品B的实现

/**
 * 产品B的具体实现
 */
public class ProductB1 implements AbstractProductB {
    //定义产品B的接口中定义的操作
}

/**
 * 产品B的具体实现
 */
public class ProductB2 implements AbstractProductB {
    //定义产品B的接口中定义的操作
}

(4)工厂具体实现

/**
 * 具体的工厂实现对象,实现创建具体的产品对象的操作
 */
public class ConcreteFactory1 implements AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ProductA1();
    }

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


/**
 * 具体的工厂实现对象,实现创建具体的产品对象的操作
 */
public class ConcreteFactory2 implements AbstractFactory {
    @Override
    public AbstractProductA createProductA() {
        return new ProductA2();
    }

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

(5)客户端的示例代码

public class Client {
    public static void main(String[] args) {
        //创建抽象工厂对象
        AbstractFactory af = new ConcreteFactory1();
        //通过抽象工厂来获取一系列的对象,如产品A和产品B
        af.createProductA();
        af.createProductB();
    }
}

四 抽象工厂模式的思考

4.1 抽象工厂的优点

  • 分离接口和实现

       客户端使用抽象工厂来创建需要的对象,而客户端根本不知道具体的实现是谁,客户端只是面向产品的接口编程而已。客户端从具体的产品的实现中解耦。

  • 使得切换产品簇变得容易

       客户端选用不同的工厂实现,就是切换不同的产品簇的过程。

4.2 抽象工厂的缺点

  • 不太容易扩展新的产品

       如果需要给整个产品簇添加一个新的产品,那么需要修改抽象工厂,这样会导致修改所有的工厂实现类。

  • 容易造成类层次复杂

       在使用抽象工厂模式的时候,如果需要选择的层次过多,那么会造成整个类层次变得复杂。

4.3 抽象工厂模式和简单工厂模式的对比

       抽象工厂和简单工厂既有区别,又有联系,可以组合使用。工厂方法模式一般是针对单独的产品对象的创建,而抽象工厂模式注重产品簇对象的创建。如果把抽象工厂创建的产品簇简化,这个产品簇就只有一个产品,那么这个时候的抽象工厂跟简单工厂差不多。

4.4 抽象工厂模式和单例模式的联系

       两个模式可以组合使用,在抽象工厂模式里面,具体的工厂实现,在整个应用中,通常一个产品系列只需要一个实例就可以了,因此可以把具体的工厂实现称为单例。

 

发布了67 篇原创文章 · 获赞 64 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/jack1liu/article/details/102363608