设计模式

设计模式2:抽象工厂模式(Abstract Factory)

2019-04-23  本文已影响0人  ygxing

1.简介

抽象工厂是创建模式中的一种
弥补了工厂方法的不足,抽象工厂可以制造一系列的产品,
例如一个工厂既可以生产PC,又可以生产鼠标
1.1优点:
- 将一组具体的产品构造放在具体工厂类里,扩展一个工厂较为方便
- 客户端可以通过工厂创建一系列产品,不需要知道创建产品的细节,不需要执行new操作
1.2缺点:
- 当新增一个产品的时候,可能需要修改工厂,扩展比较困难
1.3使用场景
- 逻辑和工厂制造产品相似的业务

2.实现方式

2.1 具体逻辑
- 两个工厂,分别是DellFactory和LenovoFactory
- 两个抽象的产品,分别是AbstractPCProduct和AbstractMouseProduct,
- DellFactory可以生产PC和Mouse,分别是DellPCProduct和DellMouseProduct
- LenovoFactory也可以生产PC和Mouse,分别是LenovoPCProduct和LenovoMouseProduct
2.1.1 接口
定义了两个接口,IProduct和IFactory,
IProduct是所有产品的父接口,
IFactory是所有共产的父接口
/**
 * 产品接口
 */
public interface IProduct {
    /**
     * 打印名称
     */
    void name();
}

/**
 * 工厂接口
 */
public interface IFactory {

    /**
     * 制造PC
     * @return
     */
    AbstractPCProduct productPC();

    /**
     * 制造鼠标
     * @return
     */
    AbstractMouseProduct productMouse();
}
2.1.1 抽象的产品
定义了两个抽象的产品AbstractPCProduct和AbstractMouseProduct,
继承了IProduct接口,
使用抽象类,规定好通用的参数和方法
/**
 * 抽象PC产品
 */
public abstract class AbstractPCProduct implements IProduct {
    /**
     * 产品名称
     */
    String name = "";

    @Override
    public void name() {
        System.out.println(name + "的PC产品");
    }
}

/**
 * 抽象鼠标产品
 */
public abstract class AbstractMouseProduct implements IProduct {

    /**
     * 产品名称
     */
    String name = "";

    @Override
    public void name() {
        System.out.println(name + "鼠标产品");
    }
}
DELL相关
定义了两个Dell的Product,继承了AbstractPCProduct抽象类,
一个DellFactory实现了IFactory接口,
用于生产DellPCProduct和DellMouseProduct
/**
 * Dell PC产品
 */
public class DellPCProduct extends AbstractPCProduct {
    {
        //名称为dell
        this.name = "Dell";
    }
}
/**
 * Dell鼠标产品
 */
public class DellMouseProduct extends AbstractMouseProduct {
    {
        //名称为dell
        this.name = "Dell";
    }
}

/**
 * Dell工厂
 */
public class DellFactory implements IFactory {

    @Override
    public AbstractPCProduct productPC() {
        // 生产Dell PC
        return new DellPCProduct();
    }

    @Override
    public AbstractMouseProduct productMouse() {
        // 生产Dell鼠标
        return new DellMouseProduct();
    }
}
lenovo相关
定义了两lenovo的Product,继承了AbstractPCProduct抽象类,
一个LenovoFactory实现了IFactory接口,
用于生产LenovoPCProduct和LenovoMouseProduct
/**
 * Lenovo PC产品
 */
public class LenovoPCProduct extends AbstractPCProduct {
    {
        // 名称为Lenovo
        this.name = "Lenovo";
    }
}
/**
 * Lenovo鼠标产品
 */
public class LenovoMouseProduct extends AbstractMouseProduct {
    {
        // 名称为Lenovo
        this.name = "Lenovo";
    }
}
//lenovo 工厂
public class LenovoFactory implements IFactory {

    @Override
    public AbstractPCProduct productPC() {
        // 生产lenovo PC产品
        return new LenovoPCProduct();
    }

    @Override
    public AbstractMouseProduct productMouse() {
        // 生产lenovo 鼠标产品
        return new LenovoMouseProduct();
    }
}
类图
抽象工厂
测试类
//抽象工厂测试类
public class FactoryAbstractTest {
    public static void main(String[] args) {
        String s1 = "dell";
        String s2 = "lenovo";
        IFactory f1 = getFactory(s1);
        IFactory f2 = getFactory(s2);

        f1.productMouse().name();
        f1.productPC().name();

        f2.productMouse().name();
        f2.productPC().name();
    }

    /**
     * 获取对应的工厂
     */
    private static IFactory getFactory(String name) {
        if ("dell".equals(name)) {
            return new DellFactory();
        } else if ("lenovo".equals(name)) {
            return new LenovoFactory();
        }
        throw new RuntimeException("name error...");
    }
}

运行结果:
    Dell的鼠标产品
    Dell的PC产品
    Lenovo的鼠标产品
    Lenovo的PC产品
上一篇下一篇

猜你喜欢

热点阅读