• 创建型设计模式(一)工厂方法模式


    文章更新时间:2020/07/15

    一、一句话背景

    我需要一辆汽车,那我可以直接从工厂里面提货,而不用去管汽车是怎么做出来的,以及生产汽车的具体实现,我只需要告诉这个工厂要生产什么品牌的汽车就好,具体的汽车生产过程我也不用管。

    二、使用场景

    使用场景:知道部分特性而创建具体对象的场景。

    如:根据环境类型(dev,test或master等)直接调用一整套环境配置

    优点:

    • 客户端不需要在负责对象的创建,明确了各个类的职责
    • 如果有新的对象增加,只需要增加一个具体产品类和具体的工厂类即可
    • 不会影响已有的代码,后期维护容易,增强系统的扩展性

    缺点:

    • 需要额外的编写代码,增加了工作量【额外编写具体工厂类和具体产品类】

    与简单工厂的区别:

    • 简单工厂:工厂类包含了具体的逻辑判断,增加类型时需要修改工厂类代码
    • 工厂方法:工厂类只定义生成抽象产品的方法,增加类型时不需要修改原来的工厂类代码,但需要新增工厂类和实现工厂类的具体产品类

    三、模型分析

    工厂定义创建抽象产品的方法,由具体工厂去实现,生成具体产品

    抽象产品定义产品的共有属性和方法,由具体产品去继承

    具体工厂实现/继承工厂类,生产具体产品

    具体产品实现/继承抽象产品

    四、UML类图

    五、代码分析

    工厂

    /**
     * 汽车工厂【工厂】
     */
    public interface CarFactory {
    
        /**
         * 生产汽车的方法
         */
        Car produceCar();
    
    }

    具体工厂

    奥迪车工厂

    /**
     * 奥迪车工厂【具体工厂】
     */
    public class AudiFactory implements CarFactory {
    
        @Override
        public Car produceCar() {
            //实现工厂接口定义的方法,生产奥迪车
            return new AudiCar();
        }
    }

    奔驰车工厂

    /**
     * 奔驰车工厂【具体工厂】
     */
    public class BenzFactory implements CarFactory {
    
        @Override
        public Car produceCar() {
            //实现工厂接口定义的方法,生产奔驰车
            return new BenzCar();
        }
    }

    宝马车工厂

    /**
     * 宝马车工厂【具体工厂】
     */
    public class BmwFactory implements CarFactory {
    
        @Override
        public Car produceCar() {
            //实现工厂接口定义的方法,生产宝马车
            return new BmwCar();
        }
    }

    抽象产品

    /**
     * 汽车【抽象产品】
     */
    public abstract class Car {
    
        /**
         * 驾驶
         */
        public abstract void drive();
    
    }

    具体产品

    奥迪车 

    /**
     * 奥迪车【具体产品】
     */
    public class AudiCar extends Car {
        @Override
        public void drive() {
            System.out.println("奥迪车驾驶综合体验不错~~~");
        }
    }

    奔驰车 

    /**
     * 奔驰车【具体产品】
     */
    public class BenzCar extends Car {
        @Override
        public void drive() {
            System.out.println("奔驰车驾驶体验豪华平稳~~~");
        }
    }

    宝马车

    /**
     * 宝马车【具体产品】
     */
    public class BmwCar extends Car {
        @Override
        public void drive() {
            System.out.println("宝马车驾驶体验运动感十足~~~");
        }
    }

    客户下单

    /**
     * 工厂模式测试类【模拟下单】
     */
    public class FactoryTest {
        public static void main(String[] args) throws Exception {
            //客户要买“宝马”车,则我们实例化一个宝马工厂出来
            CarFactory carFactory = new BmwFactory();
            //调用工厂里生产汽车方法
            Car car = carFactory.produceCar();
            //开车车咯~~~
            car.drive();
        }
    }

  • 相关阅读:
    C 语言中 static 的作用
    STM32 标准库
    STM32 HAL库与标准库的区别_浅谈句柄、MSP函数、Callback函数
    asp.net core launchsettings.json
    asp.net core mvc/api部署到iis
    依赖倒置来反转依赖
    ASP.NET Core in2020
    DDD学习一
    asp.net core学习一
    从零开始实现ASP.NET Core MVC的插件式开发
  • 原文地址:https://www.cnblogs.com/riches/p/11198488.html
Copyright © 2020-2023  润新知