美文网首页设计模式
设计模式2:抽象工厂模式(Abstract Factory)

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

作者: ygxing | 来源:发表于2019-04-23 18:04 被阅读0次

    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产品
    

    相关文章

      网友评论

        本文标题:设计模式2:抽象工厂模式(Abstract Factory)

        本文链接:https://www.haomeiwen.com/subject/ghsbgqtx.html