设计者模式 --- 抽象工厂AbstractFactory

时间:2020-03-25 20:34:20   收藏:0   阅读:68

工厂方法中只考虑生产同级别的产品,对于综合型的工厂,生产较多种类的产品无法使用,如下图,对于一个产品族,可能无法实现,这时需要使用抽象工厂。

技术分享图片

 

 首先看一下抽象工厂的定义:是一种为访问类创建一组相关或相互依赖对象的接口,并且访问类无需指定所需产品,具体类就能得到同族的不同等级的产品的模式结构。

相当于抽象工厂是工厂方法的升级版本,抽象工厂模式可以生产多个等级的产品。

使用抽象工厂模式一般需要满足以下条件:

系统中有多个产品族,每一个具体工厂创建同一族但是不同等级结构的产品

系统一次只可能消费其中某一族的产品,即同族的产品一起使用

抽象工厂模式主要优点:

缺点:

其结构:

技术分享图片

 

 接下来看一下代码实现:

抽象产品1 Product1

package abstractFactory;

/**
 * 抽象产品1
 */
public interface Product1 {

    void run();
}

抽象产品2Produce2

package abstractFactory;

/**
 * 抽象产品2
 */
public interface Product2 {

    void show();
}

具体产品ConcreteProduct11

package abstractFactory;

/**
 * 具体产品11,实现抽闲产品1的接口
 */
public class ConcreteProduct11 implements Product1 {

    @Override
    public void run() {
        System.out.println("产品11开始跑了");
    }
}

具体产品ConcreteProduct12

package abstractFactory;

/**
 * 具体产品12,实现抽闲产品1的接口
 */
public class ConcreteProduct12 implements Product1 {

    @Override
    public void run() {
        System.out.println("产品12开始跑了");
    }
}

具体产品ConcreteProduct21

package abstractFactory;

/**
 * 具体产品21,实现了抽象产品2的接口
 */
public class ConcreteProduct21 implements Product2 {

    @Override
    public void show() {
        System.out.println("具体产品21开始展示");
    }
}

具体产品ConcreteProduct22

package abstractFactory;

/**
 * 具体产品22,实现了抽象产品2的接口
 */
public class ConcreteProduct22 implements Product2 {

    @Override
    public void show() {
        System.out.println("具体产品22开始展示");
    }
}

抽象工厂AbstractFactory

package abstractFactory;

/**
 * 抽象工厂 定义生产抽象产品 1 2 接口
 */
public interface AbstractFactory {

    /**
     * 产品1
     *
     * @return 产品实例1
     */
    Product1 newProduct1();

    /**
     * 产品2
     *
     * @return 产品实例2
     */
    Product2 newProduce2();
}

具体工厂1ConcreteFactory1

package abstractFactory;

/**
 * 具体工厂1 生产具体产品 11 21
 */
public class ConcreteFactory1 implements AbstractFactory {

    @Override
    public Product1 newProduct1() {
        System.out.println("具体工厂1生产了具体产品11");
        return new ConcreteProduct11();
    }

    @Override
    public Product2 newProduce2() {
        System.out.println("具体工厂1生产了具体产品21");
        return new ConcreteProduct21();
    }
}

具体工厂2ConcreteFactory2

package abstractFactory;

/**
 * 具体工厂2 生产具体产品 12 22
 */
public class ConcreteFactory2 implements AbstractFactory {

    @Override
    public Product1 newProduct1() {
        System.out.println("具体工厂2生产了具体产品12");
        return new ConcreteProduct12();
    }

    @Override
    public Product2 newProduce2() {
        System.out.println("具体工厂2生产了具体产品22");
        return new ConcreteProduct22();
    }
}

客户端Client

package abstractFactory;


public class Client {
    public static void main(String[] args) {
        // 模拟根据指定名称实例化工厂
        AbstractFactory abstractFactory = (AbstractFactory) Utils.getObject("ConcreteFactory1");
        // 获取该工厂的产品1
        Product1 product1 = abstractFactory.newProduct1();
        // 获取该工厂的产品2
        Product2 product2 = abstractFactory.newProduce2();
        // 运行产品1
        product1.run();
        // 运行产品2
        product2.show();
    }
}

工具类

package abstractFactory;

public class Utils {

    public static Object getObject(String name){
        String cName = "abstractFactory." + name;
        System.out.println("新类名:"+cName);
        Class<?> c = null;
        try {
            // 根据名称获取类
            c = Class.forName(cName);
            // 调用该类的无参构造方法并获取实例
            return c.getDeclaredConstructor().newInstance();
        } catch (Exception e) {
            // 异常
            e.printStackTrace();
            return c;
        }
    }
}

输出:

新类名:abstractFactory.ConcreteFactory1
具体工厂1生产了具体产品11
具体工厂1生产了具体产品21
产品11开始跑了
具体产品21开始展示

适用场景:

源码地址:https://github.com/yang-shixiong/design/tree/master/src/abstractFactory

原文:https://www.cnblogs.com/yangshixiong/p/12567449.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!