秒懂设计模式之简单工厂模式(Simple Factory Pattern)

前言

人在IT江湖飘,不懂设计模式咋装*?

今天让我们一起来研究一下三种工厂模式,其均为创建型模式,即讨论的是如何创建一个类的对象的问题。就是以各种高逼格的方式最终将一个类的对象new出来,一点也不神秘。如果你发现需要一个类的对象而你又不会这些装X神器,那你就直接new好啦,爱谁谁。。。不过你也就逃脱不永远是个小白的命运啦,过几年混不下去了就只能去卖奶茶,什么?你不想那么快就去卖奶茶,那就好好学习这些装X神器!

简单工厂模式是三种工厂模式中最简单的一种。

定义

对于初学者的废话又来啦:

简单工厂模式属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,是由一个工厂对象决定创建出哪一种产品类的实例。

使用场景

最重要的知识点,这是最重要的知识点,这是最重要的知识点!

首先当然是在你需要new一个类的对象的时候,此时各种状况出现啦:

  1. 你不想直接new这个类的对象,怕以后这个类改变的时候你需要回来改代码,而此时依赖这个类的地方已经到处都是了。
  2. 这个类的对象构建过程非常复杂,你不愿意将这么复杂的构建过程一遍又一遍的写在需要用到此对象的地方。
  3. 这个类的对象在构建过程中依赖了很多其他的类,而你无法在调用的地方提供。

如何实现

业务场景

假设我们现在要生产多种牌子的笔记本电脑,例如要生产小米笔记本电脑和苹果笔记本电脑,那我们如何用代码实现这个业务呢?

使用简单工厂模式

下图是简单工厂方法模式的UML图.
在这里插入图片描述
MacComputerMiComputer 继承了Computer类,SimpleComputerFactory 类可以根据不同的条件来生成相应品牌的电脑。
简单工厂模式的核心就是通过一个工厂方法根据不同的条件生产同一类型的产品。例如此例中我们要生产的小米笔记本和苹果笔记本他们是同一类型的产品,会实现同一个接口。下面我们看下具体代码:

第一步:定义一个电脑的抽象基类,包含一个为电脑安装操作系统的抽象方法,这个就是产品要实现的共同接口。

public abstract class Computer {
    public abstract void setOperationSystem();
}

第二步:定义具体品牌的电脑类,苹果电脑和小米电脑。

public class MacComputer extends Computer {
    @Override
    public void setOperationSystem() {
        System.out.println("Mac笔记本安装Mac系统");
    }
}
public class MiComputer extends Computer {
    @Override
    public void setOperationSystem() {
        System.out.println("小米笔记本安装Win10系统");
    }
}

第三步:定义简单工厂方法类,使用一个静态工厂方法来根据不同的条件来产生不同的产品实例

public class SimpleComputerFactory {
    public static Computer makeComputer(String brand) {
        Computer computer=null;
        switch (brand) {
            case "mac":
                computer=new MacComputer();
                break;
            case "mi":
                computer=new MiComputer();
                break;
            default:
                break;
        }
        return computer;
    }
}

第四步:使用静态方法生产相应的产品实例,然后就可以调用具体实例的方法了。

   public static void main(String[] args) {
        Computer computer= SimpleComputerFactory.makeComputer("mi");
        computer.setOperationSystem();
  }

输出:

小米笔记本安装Win10系统

我们现在可以通过一个静态工厂方法,通过传入不同的参数类型来构建不同的对象实例了,我们将对象的构建过程完全交给了工厂方法类。

不使用设计模式

如果我们不使用设计模式能不能实现这个业务呢?答案当然是肯定的了,那就直接new对象咯,如下代码所示。好像不使用设计模式代码更简洁啊?这是因为此处的代码仅仅是为了演示而设计的异常简单的没有实用价值的代码,实际项目中对象之间的关系及构建过程比这个复杂的多,而且要不断的扩展和维护,这才是设计模式被引入软件系统设计的真相。

public static void main(String[] args) {
        Computer miComputer=new MiComputer();
        miComputer.setOperationSystem();
 }

优缺点

优点:不直接在客户端创建具体产品的实例,降低了耦合性。
缺点:违反了开闭原则,(对扩展开放,对修改关闭),不容易形成高内聚松耦合结构。 每当我们增加一种产品的时候就要去修改工厂方法,这样会破坏其内聚性,给维护带来额外开支。

为了克服简单工厂方法模式的缺点,工厂模式就被提了出来,我们下篇再来详细讨论。

总结

设计模式值得你刻意练习!

You May Also Like

About the Author: shusheng007

发表评论

邮箱地址不会被公开。