面向对象设计模式--创建模式--工厂方法模式factory-method

 工厂模式

作用:实现了创建者和调用者的分离

OOP(面向对象程序设计)七大原则: https://blog.csdn.net/qq_44065088/article/details/108097839
    开闭原则:一个软件实体如类,模块和函数应该对扩展开放 ( 对提供方 ) ,对修改关闭 ( 对使用方)
    依赖倒置原则:依赖倒转 ( 倒置 ) 的中心思想是面向接口编程,抽象不应该依赖细节,细节应该依赖抽象
    迪米特法则:只与直接的朋友通信

核心本质:实例化对象不直接使用new,而是调用工厂方法生成对象(工厂来new)
          将选择实现类、创建对象统一管理和控制。从而将调用者和实现类解耦。

工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)---通过增加新的工厂类实现扩展

我的理解:产品统统实现产品接口,工厂通通实现工厂接口, 任一种产品都有其对应工厂创建不管是接口还是其实现类

工厂方法模式UMl类图

 角色分析:

  1. 产品 (Product) 将会对接口进行声明。 对于所有由创建者及其子类构建的对象, 这些接口都是通用的。

  2. 具体产品 (Concrete Products) 是产品接口的不同实现。

  3. 创建者 (Creator) 类声明返回产品对象的工厂方法。 该方法的返回对象类型必须与产品接口相匹配。

    你可以将工厂方法声明为抽象方法, 强制要求每个子类以不同方式实现该方法。 或者, 你也可以在基础工厂方法中返回默认产品类型。

  4. 具体创建者 (Concrete Creators) 将会重写基础工厂方法, 使其返回不同类型的产品。

    注意, 并不一定每次调用工厂方法都会创建新的实例。 工厂方法也可以返回缓存、 对象池或其他来源的已有对象。

  下面以一个生产汽车的列子来解释工厂方法模式

Car接口和他的具体产品类

/**
 * @author jdw
 * @date 2021/8/17-18:23
 */
public interface Car {
    void name();
}
public class BMW implements Car{
    @Override
    public void name() {
        System.out.println("宝马");
    }
}
public class Tesla implements Car {
    @Override
    public void name() {
        System.out.println("特斯拉!");
    }
}
public class WuLing implements Car {
    public void name(){
        System.out.println("五菱宏光!");
    }
}

工厂接口

//定义了一个创建对象的抽象方法,由实现类 决定要实例化的类,工厂方法模式,将对象的实例化推迟到 子类工厂实现
public interface CarFactory {
    Car getCar();
}

为每一种车定制一个工厂

宝马工厂、五菱宏光工厂、特斯拉工厂

public class BMWFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new BMW();
    }
}
public class TeslaFactory implements CarFactory{

    @Override
    public Car getCar() {
        return new Tesla();
    }
}
public class WuLingFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new WuLing();
    }
}

现在有了车和车对应的工厂,我们开始进行买车操作

Consumer类

public class Consumer {
    public static void main(String[] args) {
        Car car = new WuLingFactory().getCar();
        Car car2 = new TeslaFactory().getCar();

        car.name();
        car2.name();

        Car car1 = new BMWFactory().getCar();
        car1.name();
    }
}

由此我们可以看到,我们买车根本不需要早到对应的车类,我们只需要找车的工厂,然后调用工厂的造车方法,就直接得到了车的实例。

总结:

  1. 让所有产品都遵循同一接口。 该接口必须声明对所有产品都有意义的方法。

  2. 在创建类中添加一个空的工厂方法。 该方法的返回类型必须遵循通用的产品接口。

  3. 在创建者代码中找到对于产品构造函数的所有引用。 将它们依次替换为对于工厂方法的调用, 同时将创建产品的代码移入工厂方法。 你可能需要在工厂方法中添加临时参数来控制返回的产品类型。

    工厂方法的代码看上去可能非常糟糕。 其中可能会有复杂的 switch分支运算符, 用于选择各种需要实例化的产品类。 但是不要担心, 我们很快就会修复这个问题。

  4. 现在, 为工厂方法中的每种产品编写一个创建者子类, 然后在子类中重写工厂方法, 并将基本方法中的相关创建代码移动到工厂方法中。

  5. 如果应用中的产品类型太多, 那么为每个产品创建子类并无太大必要, 这时你也可以在子类中复用基类中的控制参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值