zoukankan      html  css  js  c++  java
  • 工厂方法模式-Factory Method

    一、定义

    定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法模式使得一个类的实例化延迟到了其子类

    二、类图

    工厂方法模式包含以下几个角色:

    • 抽象产品角色(Product):具体产品对象的共同父类或共同拥有的接口。
    • 具体产品角色(ConcreateProduct):实现抽象产品接口的具体产品类,包含产品的具体细节。
    • 抽象工厂角色(Factory):是工厂方法模式的核心,任何在模式中创建对象的工厂类必须实现这个接口。
    • 具体工厂角色(ConcreateFactory):实现抽象工厂接口的具体工厂类,用于创建具体产品对象。

    静态工厂方法中,静态工厂负责创建所有的产品。而在工厂方法模式中,通过类图可知,每个产品都由一个对应的工厂创建。

    三、示例

    下面通过汽车工厂生产汽车来说明工厂方法模式的应用。

    汽车(抽象产品)

    /**
     * 抽象产品
     */
    public interface Car {
    
        void showSlogan();
    
    }

    具体的汽车

    /**
     * 奥迪车(具体产品)
     */
    public class AudiCar implements Car {
        @Override
        public void showSlogan() {
            System.out.println("伟大,不是成就,而是经历。奥迪Q7!");
        }
    }
    
    /**
     * 奔驰车(具体产品)
     */
    public class BenZCar implements Car {
        @Override
        public void showSlogan() {
            System.out.println("全新梅赛德斯-奔驰GLE SUV,万千气象,纵横无疆。");
        }
    }
    
    /**
     * 宝马车(具体产品)
     */
    public class BMWCar implements Car {
        @Override
        public void showSlogan() {
            System.out.println("便捷畅享BMW之悦,让纯粹驾驶乐趣.时刻在您身边");
        }
    }

    汽车工厂(抽象工厂)

    /**
     * 汽车工厂(抽象工厂)
     */
    public interface CarFactory {
    
        Car ProduceCar();
    
    }

    具体的工厂

    /**
     * 奥迪工厂,生产奥迪车
     */
    public class AudiCarFactory implements CarFactory {
        @Override
        public Car ProduceCar() {
            return new AudiCar();
        }
    }
    
    /**
     * 奔驰工厂,生产奔驰车
     */
    public class BenZCarFactory implements CarFactory {
        @Override
        public Car ProduceCar() {
            return new BenZCar();
        }
    }
    
    /**
     * 宝马工厂,生产宝马车
     */
    public class BMWCarFactory implements CarFactory {
        @Override
        public Car ProduceCar() {
            return new BMWCar();
        }
    }

    客户端代码

    public class Client {
        public static void main(String[] args) {
            //奔驰车工厂,生产奔驰车
            CarFactory benzCarFactory = new BenZCarFactory();
            Car benzCar = benzCarFactory.ProduceCar();
            benzCar.showSlogan();
    
            //宝马车工厂,生产宝马车
            CarFactory bmwCarFactory = new BMWCarFactory();
            Car bmwCar = bmwCarFactory.ProduceCar();
            bmwCar.showSlogan();
    
            //奥迪车工厂,生产奥迪车
            CarFactory audiCarFactory = new AudiCarFactory();
            Car audiCar = audiCarFactory.ProduceCar();
            audiCar.showSlogan();
        }
    }

    每种汽车都是由与之对应的工厂生产出来的。

    四、优缺点

    优点:

    1.与简单工厂模式相比,工厂方法模式减轻了工厂类的负担,把某一类产品交由一个工厂生产,不同的工厂生产不同类别的产品。

    2.遵守了开闭原则。增加某一类产品时并不需要修改工厂类,只需要添加生产这类产品的工厂即可。

    缺点:

    随着产品种类的数量的增长,工厂类也会随之增加,将不利于系统的维护。

     ……更多设计模式的内容,可以访问Refactoring.Guru
  • 相关阅读:
    jQuery实现DropDownList(MVC)
    解决MVC应用程序数据重复加载问题
    MVC应用程序使用jQuery接收Url的参数
    openstack上创建vm实例后,状态为ERROR问题解决
    分布式监控系统Zabbix--完整安装记录-批量添加主机和自动发现端口
    LInux下设置账号有效时间 以及 修改用户名(同时修改用户组名和家目录)
    Rsync+Inotify实时同步环境部署记录
    Shell+Curl监控网站页面访问状态,利用SendEmail发邮件通知
    Shell脚本字符串匹配及日常命令工具
    分布式监控系统Zabbix-3.0.3-完整安装记录(6)-微信报警部署
  • 原文地址:https://www.cnblogs.com/rouqinglangzi/p/11122106.html
Copyright © 2011-2022 走看看