一文搞懂设计模式--简单工厂

100 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情

简单工厂

介绍

提供一个创建对象实例的功能,而无须关心具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体实现的类

实例

类图如下

image-20221017224548230

UML图的解释:

  • Car为抽象类
  • VanCar和MiniCar为Car的子类
  • WuliFactory创建负责创建这两个对象(通过黄色部分逻辑判断)

抽象汽车接口

为什么要抽象出一个汽车接口呢?我们直接生成汽车类不行吗?

这里其实也体现了设计模式7大原则中的依赖倒置原则,也就是面向接口编程。同时也能体现出开闭原则,对扩展开放,对修改关闭。如果需要新的汽车,那么就新建一个类去实现这个接口即可!(不改变源代码,而是对其扩展)

public interface AbstractCar {
    void run();
}

汽车实现类

public class BenchiCar implements AbstractCar{
    @Override
    public void run() {
        System.out.println("我是奔驰,我可以跑跳着跑!");
    }
}
​
​
public class WulingCar implements AbstractCar{
    @Override
    public void run() {
        System.out.println("我是五菱,我能飞!");
    }
}

简单工厂

这个工厂很简单,就是提供了一个方法。可以根据传来的参数创建相应的对象

public class CarFactory {
    public AbstractCar returnCar(String type) {
        if ("Benchi".equals(type)) {
            return new BenchiCar();
        } else if ("Wuling".equals(type)) {
            return new WulingCar();
        }
        //......有新的汽车进来,那就需要改变造车厂的逻辑,在添加if,else
        return null;
    }
}

会员端

我们在会员端来体会一下简单工厂的作用:

  • new这个简单工厂
  • 调用简单工厂中创建对象的方法
  • 运行对应对于的方法

通过运行结果我们可以发现,我们只需要创建工厂然后调用里面的方法对象就被创建出来了。这不就是我们前面说的隐藏了对象的创建细节,并提供一个创建对象的通用接口,实现了解耦。

public class Client {
    public static void main(String[] args) {
        CarFactory factory = new CarFactory();
​
        AbstractCar benci = factory.returnCar("Benchi");
        AbstractCar wuling = factory.returnCar("Wuling");
​
        benci.run();
        wuling.run();
    }
}
​
我是奔驰,我可以跑跳着跑!
我是五菱,我能飞!

总结

1.使用的场景?

如果想要完全的封装和隔离具体的实现,让外部只能通过接口来操作封装部分,那这个时候选择简单工厂。

如果想把创建对象的工作集中管理,可以选用简单工厂

2.本质是什么?

选择实现

为什么是选择实现?因为简单工厂已经把对象创建好了,客户端只需要进行选择即可。 这样也可以使客户端和实现之间解耦。如果你的实现发生了变化,也不需要动客户端的代码。

3.它解决了什么问题?

  • 将类的实例化和对象的操作分开,避免了在客户端代码中显示指定,实现了解耦
  • 屏蔽了使用细节,消费者可以直接使用

4.它体现了设计模式中什么原则?

面向接口编程(依赖倒置原则)

5.存在的缺陷?

  • 可能增加客户端的复杂度:客户端需要理解参数是什么意义,同时也暴露了内部的实现

6.你认为与它相关的设计模式有哪些? 它们之间的区别有哪些?

后期更新...