设计模式:工厂模式,解除耦合的利器

工厂模式是使用频率很高的一种设计模式,在面试中也经常问到,今天我们就来学习它。

为什么要用工厂模式?

解答这个问题前,我们先来了解什么是工厂模式。

工厂模式其实也称创建模式,是用于创建对象的一种方式。本质上就是用工厂方法来代替new实例化对象。

举个例子:我们在编写代码的时候,在一个A类中通过new的方式实例化了类B,那么A类和B类之间就存在耦合,如果以后修改了B类的代码和使用方式,例如需要在构造函数中传入参数,那么A类也就需要跟着修改了,一个类的依赖可能影响不大,但若有多个类依赖了B类,那么这个工作量将会相当的大,这无疑是件非常痛苦的事。这种情况下,我们需要把创建实例的工作单独分离,与调用方解耦,也就是使用工厂方法创建实例的工作封装起来。这样我们在需要调用对象的时候就不需要关心那些复杂的实例化问题。

工厂模式

工厂模式可分为两类:简单工厂模式和工厂模式。

简单工厂模式

定义一个接口和实现类,建立一个工厂类这些实现类进行实例的创建。

我们用球来举例,定义一个基本的接口Ball,和一个抽象方法Play (玩),

public interface Ball {
    void play();
}

创建一个篮球的类和一个足球的类,并实现该接口,

public class BasketBall implements Ball {
    public void play() {
        System.out.println("打篮球~~~");
    }
}
public class FootBall implements Ball {
    public void play() {
        System.out.println("踢足球~~~");
    }
}

然后,创建一个工厂类,可以用于生产篮球或者足球,

public class BallFactory {

    public Ball produce(String type) {
        if ("basketball".equals(type)) {
            return new BasketBall();
        } else if ("football".equals(type)) {
            return new FootBall();
        }
        return null;
    }
}

工厂类建好以后,我们就可以实例化工厂类,并调用 produce 方法来创建对应的实例对象,

public static void main(String[] args) {
    BallFactory factory = new BallFactory();
    Ball ball = factory.produce("basketball");
    ball.play();
}

结果输出:打篮球~~~

这就是简单工厂模式的基本实现,用关系图来表示就是:

这种模式的优点是代码简单,能够根据具体的参数返回对应的实例对象。

当然缺点也很明显,就是工厂类集中了所有实例的创建逻辑,如果增加业务就要多出相应的工厂方法,不仅代码可能变得臃肿,也容易违反GRASPR的高内聚的责任分配原则

工厂模式

又称多态性工厂模式,是对简单工厂模式的改进。工厂模式中,一个子类对应一个工厂类,这些工厂类都实现了一个工厂接口。这相当于把一个简单工厂类拆分成多个工厂,这样代码就不会都耦合在同一个类里了。

具体的产品接口和实现类还是复用上面的代码,我们只需关注工厂方法的逻辑即可,

先创建一个工厂的接口

public interface IFactory {
    void produce();
}

然后创建对应业务的工厂类

public class BasketFactory implements IFactory {
    public Ball produce() {
        return new BasketBall();
    }
}
public class FootFactory implements IFactory {
    public Ball produce() {
        return new FootBall();
    }
}

测试代码

public static void main(String[] args) {
    BasketFactory basketFactory = new BasketFactory();
    Ball basket = basketFactory.produce();
    FootFactory footFactory = new FootFactory();
    Ball foot = footFactory.produce();
    basket.play();
    foot.play();
}

输出结果是:

打篮球~~~
踢足球~~

如上所示,如果需要添加新的产品,如排球,我们就多写一个工厂类即可,这样就不会把所有的业务都耦合到一个工厂类中了,用关系图表示如下:

最后,总结一下工厂模式的优点吧,

1、良好的封装性,代码结构清晰,调用者只需知道产品的类名即可,不需要知道创建对象的过程,降低代码间的耦合。

2、扩展性优秀,如果增加一个产品类,只需增加一个对应的工厂类。

3、屏蔽产品类。产品类的实现如何变化,调用者都不需要关心,只需关心产品的接口,只要接口保持不变,系统中的上层模块就不会发生变化。

4、工厂模式是典型的解耦框架,高层模块只需要知道产品的抽象类,其他的实现类都不需要关心,符合迪米特法则,符合依赖倒置原则,符合里氏替换原则。

参考:

《设计模式之禅》

(0)

相关推荐

  • [读书笔记] 《大话设计模式》

    作者:程杰 前言 成为 诗人 后 可能 不需要 刻意 地 按照 某种 模式 去 创作, 但 成为 诗人 前 他们 一定 是 认真 地 研究 过 成百上千 的 唐诗 宋词. 古今 名句. 第 1 章 代 ...

  • 大话设计模式

    设计模式概览 1.简单工厂模式 结构图 代码实现 public class Operation { private double _numberA = 0; private double _numbe ...

  • 设计模式-工厂模式

    工厂顾名思义就是创建产品,本质就是用工厂方法代替new操作创建一种实例化对象的方式.根据不同的实现方式和抽象级别又可分为简单工厂,工厂方法和抽象工厂三种模式. 案例 需求 封装一个SqlHelper类 ...

  • PHP设计模式—工厂模式之简单工厂模式

    定义: 简单工厂模式:将调用者和创建者分离,实现解耦,调用者直接向工厂请求,通过工厂去选择需要实例化的对象,用一个单独的类来做这个创建实例的过程. 代码实例: 问题:假设一个关于个人事务管理的项目中有 ...

  • java设计模式----工厂模式

    简单工厂模式 简单工厂模式不是 23 种里的一种,简而言之,就是有一个专门生产某个产品的类. 比如下图中的鼠标工厂,专业生产鼠标,给参数 0,生产戴尔鼠标,给参数 1,生产惠普鼠标. 工厂模式 工厂模 ...

  • 创建型设计模式--工厂模式、抽象工厂模式

    一.小案例分析 1.功能需求: 实现一个发送信息的功能,要便于扩展与维护. (1)发送信息的工具有很多,比如短信.微信.邮件.QQ等. (2)选择某个工具进行信息发送. 2.小菜鸡去实现: (1)定义 ...

  • PHP设计模式之简单工厂模式

    PHP设计模式之简单工厂模式 先从简单工厂入门,不管是面试还是被他人面试,在问到设计模式的时候,大多数人都会提到工厂模式.毫无疑问,工厂相关的几种模式在设计模式中是最出名的也是应用比较广泛的一种模式. ...

  • PHP设计模式之抽象工厂模式

    PHP设计模式之抽象工厂模式 工厂模式系列中的重头戏来了,没错,那正是传闻中的抽象工厂模式.初次听到这个名字的时候你有什么感觉?反正我是感觉这货应该是非常高大上的,毕竟包含着"抽象" ...

  • [PHP小课堂]PHP设计模式之简单工厂模式

    PHP设计模式之工厂方法模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • [PHP小课堂]PHP设计模式之抽象工厂模式

    [PHP小课堂]PHP设计模式之抽象工厂模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 设计模式——把类作为参数的抽象工厂模式

    今天给大家介绍一个非常简单的设计模式,一学就会,非常好用. 这个模式叫做抽象工厂模式,大家可能对工厂模式比较熟悉,在工厂模式当中封装了实例的创建逻辑.主要的用途一般是将一些复杂的类的创建过程整合在一起 ...