设计模式初级:03-抽象工厂模式

一、定义

    抽象工厂模式是利用一个超级工厂来创建其他工厂。该设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

    在抽象工厂模式中,接口是负责创建一个生成别的对象的工厂,而不是生产指定的类。每个生成对象的工厂都按照工厂模式提供对象。

二、详细介绍

  • 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
  • 解决问题:主要解决接口选择的问题。
  • 使用场景:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
  • 解决方式:在一个产品族里面,定义多个产品。
  • 优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
  • 缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。
  • 应用实例:1、QQ 换皮肤,一整套一起换。 2、生成不同操作系统的程序。

三、实现

1、创建绘制形状的接口

/**
 * desc: 创建形状的接口
 * author: xuebin3765@163.com
 * date: 2020/01/20
 */
public interface Shape {
    public void draw();
}

2、创建实现绘制形状接口的实现类

/**
 * desc: 画圆实体类
 * @Author guodandan
 * @Date 2020/1/18 16:58
 */
public class Circle implements Shape {
    public void draw() {
        System.out.println(":::::::: draw() ::: Circle");
    }
}

/**
 * desc: 画方实体类
 * @Author guodandan
 * @Date 2020/1/18 16:56
 */
public class Rectangle implements Shape {
    public void draw() {
        System.out.println(":::::::: draw() :: Rectangle");
    }
}

3、创建设置颜色的接口

/**
 * desc: 设置颜色接口
 * author: xuebin3765@163.com
 * date: 2020/01/25
 */
public interface Color {
    public void show();
}

4、创建设置不同颜色的实现类

/**
 * desc: 设置颜色为红色
 * author: xuebin3765@163.com
 * date: 2020/01/25
 */
public class Red implements Color {
    @Override
    public void show() {
        System.out.println(":::::::: show() :: red");
    }
}

/**
 * desc: 设置颜色为绿色
 * author: xuebin3765@163.com
 * date: 2020/01/25
 */
public class Green implements Color {
    @Override
    public void show() {
        System.out.println(":::::::: show() :: green");
    }
}

5、为 Color 和 Shape 对象创建抽象类来获取工厂

/**
 * desc: 抽象工厂
 * author: xuebin3765@163.com
 * date: 2020/01/20
 */
public abstract class AbstractFactory {

    public abstract Color getColor(Class<? extends Color> clazz);

    public abstract Shape getShape(Class<? extends Shape> clazz);

}

6、创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象

/**
 * desc: 抽象工厂实现类,实现颜色工厂对象的创建
 * author: xuebin3765@163.com
 * date: 2020/01/25
 */
public class ColorFactory extends AbstractFactory {

    @Override
    public Color getColor(Class<? extends Color> clazz) {
        try {
            return clazz.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 通过反射,利用工厂模式实现目标实现类。
     * 优点: 每次增加新的实例对象,不需要修改工厂方法,扩展性好
     * @param clazz 目标类class
     * @return 目标类
     */
    @Override
    public Shape getShape(Class<? extends Shape> clazz) {
        return null;
    }
}

package net.cxyk.ch02_asbFactory;

/**
 * desc: 抽象工厂实现类,实现画图工厂对象的创建
 * author: xuebin3765@163.com
 * date: 2020/01/25
 */
public class ShapeFactory extends AbstractFactory {

    @Override
    public Color getColor(Class<? extends Color> clazz) {
        return null;
    }

    /**
     * 通过反射,利用工厂模式实现目标实现类。
     * 优点: 每次增加新的实例对象,不需要修改工厂方法,扩展性好
     * @param clazz 目标类class
     * @return 目标类
     */
    @Override
    public Shape getShape(Class<? extends Shape> clazz) {
        try {
            return clazz.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }
}

7、创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂

/**
 * desc: 创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂。
 * author: xuebin3765@163.com
 * date: 2020/01/26
 */
public class FactoryProducer {
    public static AbstractFactory getFactory(Class<? extends AbstractFactory> clazz){
        try {
            return clazz.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }
}

8、测试类

import org.junit.Test;

/**
 * desc:
 * author: xuebin3765@163.com
 * date: 2020/01/26
 */
public class TestAbstractFactory {
    @Test
    public void test(){

        // 1、利用抽象工厂对象创建画图工厂对象
        AbstractFactory shapeFactory = FactoryProducer.getFactory(ShapeFactory.class);
        // 2、利用画图工厂对象创建画圆对象,并使用调用画图方法
        Shape shape = shapeFactory.getShape(Circle.class);
        shape.draw();;
        // 3、利用画图工厂对象创建画方对象,并使用调用画图方法
        shape = shapeFactory.getShape(Rectangle.class);
        shape.draw();
        // 4、利用抽象工厂对象创建颜色工厂对象
        AbstractFactory colorFactory = FactoryProducer.getFactory(ColorFactory.class);
        // 5、利用颜色工厂对象创建画红色对象,并调用方法设置颜色。
        Color color = colorFactory.getColor(Red.class);
        color.show();
        // 6、利用颜色工厂对象创建画绿色对象,并调用方法设置颜色。
        color = colorFactory.getColor(Green.class);
        color.show();
    }
}

9、测试结果

:::::::: draw() ::: Circle
:::::::: draw() :: Rectangle
:::::::: show() :: red
:::::::: show() :: green

10、更多内容

标题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值