zoukankan      html  css  js  c++  java
  • Java设计模式从精通到入门五 抽象工厂方法模式

    定义

    抽象工厂类为创建一组相关和相互依赖的对象提供一组接口,而无需指定一个具体的类。

    ​ 这里我得把工厂方法模式得定义拿出来做一下比较:定义一个创建对象的接口,由子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类。这里强调一下,工厂方法包括:简单工厂模式,和工厂方法模式等一些系列的工厂方法模式的变形。

    案例

    ​ 现在有两个产品,一个是手机,一个是电脑。手机和电脑都是不同的生产商生产的。我们要实现一个工厂管理系统,记录华为和苹果着两家工厂生产的手机和电脑信息。

    ​ 已知,华为和苹果都有自己的工厂,华为的叫做华为工厂,苹果的叫做苹果工厂。华为工厂生产华为手机和华为电脑。苹果工厂生产苹果手机和苹果电脑。用抽象工厂模式实现改系统,他的设计图如 图一:图1

    图一

    代码如下

    Factory类:

    /**
    * @InterfaceName Factory
    * @Description 抽象工厂
    * @Author ouyangkang
    * @Date 2019-01-19 11:25
    **/
    public interface Factory {
       /**
        * @Author ouyangkang
        * @Description 生产手机
        * @Date 11:25 2019/1/19
        * @param
        * @return com.设计模式.factory.abstractfactory.Phone
       **/
       Phone createPhone();
       /**
        * @Author ouyangkang
        * @Description 生产电脑
        * @Date 11:26 2019/1/19
        * @param
        * @return com.设计模式.factory.abstractfactory.Computer
       **/
       Computer createComputer();
    }
    

    IphoneFactory类

    /**
     * @ClassName IphoneFactory
     * @Description 苹果厂商之生产苹果的产品
     * @Author ouyangkang
     * @Date 2019-01-19 11:36
     **/
    public class IphoneFactory implements Factory{
        @Override
        public Phone createPhone() {
            return new Iphone();
        }
    
        @Override
        public Computer createComputer() {
            return new IphoneComputer();
        }
    }
    

    HuaWeiFactory类

    /**
     * @ClassName HuaWeiFactory
     * @Description TODO
     * @Author ouyangkang
     * @Date 2019-01-19 11:37
     **/
    public class HuaWeiFactory implements Factory {
        @Override
        public Phone createPhone() {
            return new HuaWeiIphone();
        }
    
        @Override
        public Computer createComputer() {
            return new HuaWeiComputer();
        }
    }
    
    

    Phone类

    /**
     * @InterfaceName Phone
     * @Description 手机接口
     * @Author ouyangkang
     * @Date 2019-01-19 11:21
     **/
    public interface Phone {
        /**
         * @Author ouyangkang
         * @Description 手机生产商
         * @Date 11:23 2019/1/19
         * @param
         * @return void
        **/
        void name();
        /**
         * @Author ouyangkang
         * @Description 通信功能
         * @Date 11:22 2019/1/19
         * @param
         * @return void
        **/
        void communication();
    }
    

    Iphone类

    /**
     * @ClassName Iphone
     * @Description TODO
     * @Author ouyangkang
     * @Date 2019-01-19 11:27
     **/
    public class Iphone implements Phone {
        @Override
        public void name() {
            System.out.println("苹果手机");
        }
    
        @Override
        public void communication() {
            System.out.println("用苹果手机进行通信");
        }
    }
    

    HuaWeiPhone类

    
    /**
     * @ClassName HuaWeiPhone
     * @Description TODO
     * @Author ouyangkang
     * @Date 2019-01-19 11:33
     **/
    public class HuaWeiPhone implements Phone {
        @Override
        public void name() {
            System.out.println("华为手机");
        }
    
        @Override
        public void communication() {
            System.out.println("用华为手机进行通信");
        }
    }
    

    Computer类

    /**
     * @InterfaceName Computer
     * @Description 电脑
     * @Author ouyangkang
     * @Date 2019-01-19 11:23
     **/
    public interface Computer {
        /**
         * @Author ouyangkang
         * @Description 电脑生产商
         * @Date 11:24 2019/1/19
         * @param
         * @return void
        **/
        void name();
    
        /**
         * @Author ouyangkang
         * @Description 上网
         * @Date 11:24 2019/1/19
         * @param
         * @return void
        **/
        void surf();
    }
    

    HuaWeiComputer类和IPhoneComputer类和上面HuaWeiIphone和Iphone类似代码就不重复了。
    Client类

    public class Client {
        public static void main(String[] args) {
            //苹果厂商
            Factory iphoneFactory = new IphoneFactory();
    
            Computer iphoneFactoryComputer = iphoneFactory.createComputer();
            iphoneFactoryComputer.name();
            iphoneFactoryComputer.surf();
    
            System.out.println("--------------------------");
            Phone phone = iphoneFactory.createPhone();
            phone.name();
            phone.communication();
    
    
            System.out.println("--------------------------");
    
            // 华为厂商
            Factory huaWeiFactory = new HuaWeiFactory();
    
            Computer huaWeiFactoryComputer = huaWeiFactory.createComputer();
            huaWeiFactoryComputer.surf();
            huaWeiFactoryComputer.name();
    
            System.out.println("--------------------------");
    
            Phone huaWeiPhone = huaWeiFactory.createPhone();
            huaWeiPhone.communication();
            huaWeiPhone.name();
        }
    }
    

    运行得到结果

    苹果电脑
    用苹果电脑上网
    --------------------------
    苹果手机
    用苹果手机进行通信
    --------------------------
    用华为电脑上网
    华为电脑
    --------------------------
    用华为手机进行通信
    华为手机
    

    总结

    ​ 上面得简单UML类图我用Visual Paradigm 15.2划了好久,想起了学校外教教我们画这个得时候,后悔当初学得不好,现在只能自己慢慢摸索。

    ​ 抽象工厂从定义上是很好理解的,为创建一组相关得或者相互依赖得对象提供一个接口,无需指定一个具体得类。一开始自己对于抽象工厂和工厂方法模式总是混淆,但是如果咬文嚼字得看这个两个设计模式得定义得话,然后看代码还是很好区别得。如果你看到一个Factory只有定义一个实例化子类得接口,那么你就可以认为它是工厂方法模式,如果你看到一个Factory中定义了多个实例化子类的不同接口的话,那么他就是抽象工厂方法。

  • 相关阅读:
    前端面试:Vue.js常见的问题
    Web前端攻击方式及防御措施
    JavaScript代码规范
    bind、apply、call的理解
    Markdown标记语言简介及使用方法
    github个人主页的建立
    深度理解“高内聚低耦合”
    私有云与公有云的区别
    响应式网页设计
    redis和mongodb比较
  • 原文地址:https://www.cnblogs.com/Krloypower/p/10308549.html
Copyright © 2011-2022 走看看