美文网首页
设计模式《抽象工厂模式》

设计模式《抽象工厂模式》

作者: 天道__ | 来源:发表于2018-07-08 17:43 被阅读0次

    引言

      上一回怎么说了工厂方法模式,这回咱们来讲一讲工厂模式的另外一种表现,今天的主角"抽象工厂模式"。

    示例地址

      Demo

    先上类图

    image

    看看定义

      为创建一组相关或者相互依赖的对象提供一个接口,而不需要指定它们的具体类。

    使用场景

      一个对象族有相同的约束时可以使用抽象工厂模式。

    抽象工厂中的2个概念

    产品族

      位于不同产品等级结构中,功能相关联的产品组成的家族。代表的是纵向结构。
      举个例子,华为有华为笔记本,华为手机,华为手环等,小米也有小米手机,小米笔记本,小米手环。华为这个系列的构成了家族。称为产品族。

    产品等级

      产品等级结构即产品的继承结构。代表的是横向结构。
      举个列子,一个抽象类手机,下面可以生成小米手机、华为手机。

    产品族与产品等级图

    image

    产品类

    1. 手机
    /**
     * 手机
     *
     * @author 512573717@qq.com
     * @created 2018/7/9  上午10:19.
     */
    public interface IPhone {
        void phone();
    }
    
    
    /**
     * 小米手机
     *
     * @author 512573717@qq.com
     * @created 2018/7/9  上午10:25.
     */
    public class XiaomiPhone implements IPhone {
        @Override
        public void phone() {
            System.out.println("小米手机");
        }
    }
    
    
    /**
     * 华为手机
     *
     * @author 512573717@qq.com
     * @created 2018/7/9  上午10:23.
     */
    public class HuaweiPhone implements IPhone {
        @Override
        public void phone() {
            System.out.println("华为手机");
        }
    }
    
    2. 笔记本
    /**
     * 笔记本
     *
     * @author 512573717@qq.com
     * @created 2018/7/9  上午10:27.
     */
    public interface IComputer {
        void computer();
    }
    
    
    /**
     * 小米笔记本
     *
     * @author 512573717@qq.com
     * @created 2018/7/9  上午10:44.
     */
    public class XiaomiComputer implements IComputer {
        @Override
        public void computer() {
            System.out.println("小米笔记本");
        }
    }
    
    
    /**
     * 华为笔记本
     *
     * @author 512573717@qq.com
     * @created 2018/7/9  上午10:37.
     */
    public class HuaweiComputer implements IComputer {
        @Override
        public void computer() {
            System.out.println(" 华为笔记本");
        }
    }
    
    3. 手环
    /**
     * 手环
     *
     * @author 512573717@qq.com
     * @created 2018/7/9  上午10:55.
     */
    public interface IBracelet {
        void bracelet();
    }
    
    
    /**
     * 小米手环
     *
     * @author 512573717@qq.com
     * @created 2018/7/9  上午10:59.
     */
    public class XiaomiBracelet implements IBracelet {
        @Override
        public void bracelet() {
            System.out.println("小米手环");
        }
    }
    
    
    /**
     * 华为手环
     *
     * @author 512573717@qq.com
     * @created 2018/7/9  上午10:57.
     */
    public class HuaweiBracelet implements IBracelet {
        @Override
        public void bracelet() {
            System.out.println("华为手环");
        }
    }
    
    4. 工厂类
    /**
     *  抽象工厂
     * @author 512573717@qq.com
     * @created 2018/7/9  上午10:16.
     */
    public abstract class ProductFactory {
        // 创建手机
        public abstract IPhone createPhone();
        // 创建笔记本
        public abstract IComputer createComputer();
        // 创建手环
        public  abstract IBracelet createBracelet();
    }
    
    
    /**
     * 小米
     *
     * @author 512573717@qq.com
     * @created 2018/7/9  上午11:09.
     */
    public class Xiaomi extends ProductFactory {
    
        @Override
        public IPhone createPhone() {
            return new XiaomiPhone();
        }
    
        @Override
        public IComputer createComputer() {
            return new XiaomiComputer();
        }
    
        @Override
        public IBracelet createBracelet() {
            return new XiaomiBracelet();
        }
    }
    
    
    /**
     * 华为
     *
     * @author 512573717@qq.com
     * @created 2018/7/9  上午11:03.
     */
    public class Huawei extends ProductFactory {
    
        @Override
        public IPhone createPhone() {
            return new HuaweiPhone();
        }
    
        @Override
        public IComputer createComputer() {
            return new HuaweiComputer();
        }
    
        @Override
        public IBracelet createBracelet() {
            return new HuaweiBracelet();
        }
    }
    
    5. Client测试
     //华为系列
     System.out.println("华为");
     ProductFactory huawei = new Huawei();
     huawei.createPhone().phone();
     huawei.createComputer().computer();
     huawei.createBracelet().bracelet();
    
     //小米系列
     System.out.println("小米");
     ProductFactory xiaomi=new Xiaomi();
     xiaomi.createPhone().phone();
     xiaomi.createComputer().computer();
     xiaomi.createBracelet().bracelet();
    

    总结

      抽象工厂模式是某一系列的产品的工厂。可以创建多个不同类型的产品。例如上面所说的 华为是一个产品工厂,能够创建手机 、笔记本、手机等多个类型的产品。

    抽象工厂 与工厂方法的区别

      工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。

    相关文章

      网友评论

          本文标题:设计模式《抽象工厂模式》

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