【设计模式】工厂模式_从入门到出门

简介

作用:

创建者调用者分离

分类:

  • 简单工厂模式

    • 用来生成同一等级结构中的任意产品(对于增加新的产品,需扩展原有代码)

      扩展原有代码:不满足开闭原则

  • 工厂方法模式

    • 用来生成同一等级结构中的固定产品(支持增加任意产品)

      满足开闭原则

  • 抽象工厂模式(本篇不介绍)

    • 围绕一个简单工厂创建其他工厂,该超级工程又称其他工厂的工厂

引例

场景:消费者买车!

1.写一个Car的接口,定义车的规范,如何造车。

2.实现了Car接口的类就是车。

1.Car接口

public interface Car {
    void getName();
}

2. 有两辆车

public class AE86 implements Car{

    @Override
    public void getName() {
        System.out.println("AE86...");
    }
}
public class Tesla implements Car {
    @Override
    public void getName() {
        System.out.println("Tesla...");
    }
}

3. 消费者买车

public class Consumer {
    public static void main(String[] args) {
        Car ae86 = new AE86();
        Car tesla = new Tesla();

        ae86.getName();
        tesla.getName();
    }
}

这样就实现了消费者买车!

但是,从上面例子可以看出一个问题,消费者买车的时候,车都需要自己造(new),这显然不合理!

(new 一辆车就是造一辆车,可能还需要很多参数,如果消费者买一辆车还需要知道车怎么造的,那显然不符合事实)

消费者买车,希望直接就能买到造好的车(不需要自己new),所以这需要一个中介,这个中介就是工厂

买车流程图

在这里插入图片描述

简单工厂模式

需要建一个车工厂来造车

1.车工厂

public class CarFactory {
    public static Car getCar(String car){
        if(car.equals("AE86")){
            return new AE86();
        }else if(car.equals("Tesla")){
            return new Tesla();
        }else {
            return null;
        }
    }
}

2.消费者买车

public class Consumer {
    public static void main(String[] args) {
        //简单工厂
        Car ae86 = CarFactory.getCar("AE86");
        Car tesla = CarFactory.getCar("Tesla");
        ae86.getName();
        tesla.getName();
    }
}

有了车工厂,消费者只需要告诉车工厂要什么车就能买到了,而再也不用自己造了!

买车流程图

在这里插入图片描述

但是,在加入新产品的车后,车工厂的代码也要做相应的修改(例如增加if语句)。这显然违背了开闭原则

简单工厂方法也称静态工厂方法

所以接下来介绍一种新的方法

工厂方法

为了满足开闭原则,所以有了工厂方法,但同时需要付出一定的代价!

1.先把车工厂抽象化

public interface CarFactory {
    Car getCar();
}

2.每一款车对应一个工厂

public class AE86Factory implements CarFactory {
    @Override
    public Car getCar() {
        return new AE86();
    }
}
public class TeslaFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new Tesla();
    }
}

3.消费者买车

public class Consumer {
    public static void main(String[] args) {
        //工厂方法
        Car ae86 = new AE86Factory().getCar();
        Car tesla = new TeslaFactory().getCar();
        
        ae86.getName();
        tesla.getName();
    }
}

现在扩展一辆车,只需要写一个实现Car接口类的车,再写一个该车对应的工厂。满足了开闭原则

买车流程图

在这里插入图片描述

总结

虽然工厂方法满足了开闭原则,但对于每次扩展,都需要增加更多的类。这也不是很好的选择

对比:

比较选择
结构复杂度简单工厂更佳
代码复杂度简单工厂更佳
编程复杂度简单工厂更佳
管理上的复杂度简单工厂更佳
根据设计原则工厂方法更佳
选择
--------------------------
结构复杂度简单工厂更佳
代码复杂度简单工厂更佳
编程复杂度简单工厂更佳
管理上的复杂度简单工厂更佳
根据设计原则工厂方法更佳
根据实际业务简单工厂更佳
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值