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

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

简单工厂


介绍


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


实例


类图如下

image.png

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.你认为与它相关的设计模式有哪些? 它们之间的区别有哪些?

后期更新...



相关文章
|
7月前
|
设计模式 Java 测试技术
创建型设计模式01-简单工厂模式
创建型设计模式01-简单工厂模式
18 0
|
6天前
|
设计模式 Java 数据库
小谈设计模式(2)—简单工厂模式
小谈设计模式(2)—简单工厂模式
|
6天前
|
设计模式 Java PHP
php设计模式--简单工厂模式(一)
php设计模式--简单工厂模式(一)
16 0
|
6天前
|
设计模式
设计模式-简单工厂和工厂方法
设计模式-简单工厂和工厂方法
|
6天前
|
设计模式 uml
【设计模式】一文搞定简单工厂模式!
【设计模式】一文搞定简单工厂模式!
8 2
|
6天前
|
设计模式 算法
设计模式思考,简单工厂模式和策略模式的区别?
设计模式思考,简单工厂模式和策略模式的区别?
|
6天前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
|
6天前
|
设计模式 测试技术 Go
[设计模式 Go实现] 创建型~简单工厂模式
[设计模式 Go实现] 创建型~简单工厂模式
|
6天前
|
设计模式
设计模式(一)简单工厂模式
设计模式(一)简单工厂模式
15 0
|
7月前
|
设计模式 算法 Java
解锁设计模式的神秘面纱:编写无懈可击的代码之简单工厂设计模式
解锁设计模式的神秘面纱:编写无懈可击的代码之简单工厂设计模式
32 0