设计模式-简单工厂模式

工厂模式:

工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。

通俗的说,在我们需要一辆汽车时,我们只需要告诉工厂需要什么车,让工厂去造,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

工厂模式分为三种:

1.简单工厂:把对象的创建放到一个工厂类中,通过参数来创建不同的对象。这个缺点是每添一个对象,就需要对简单工厂进行修改(尽管不是删代码,仅仅是添一个switch case,但仍然违背了“不改代码”的原则)

2.工厂方法:每种产品由一种工厂来创建,一个工厂保存一个new,基本完全遵循 “不改代码”的原则

3.抽象工厂:仅仅是工厂方法的复杂化,保存了多个new

简单工厂模式:

属于创建型模式,又叫做静态工厂方法模式。

但是,简单工厂模式并不在23种设计模式之中,它可以看做是工厂方法模式的一种特殊实现。

通过专门定义一个工厂类(类中定义了一个静态方法),负责创建其他类的实例。

模式中包含的角色及职责:

1.工厂(Creator)角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。

2.抽象(Product)角色 :简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

3.具体产品(Concrete Product)角色: 简单工厂模式所创建的具体实例对象。

使用方法:

1.定义抽象产品类/定义产品公共接口

2.定义具体实现产品类

3.创建工厂类,通过创建静态方法根据传入不同参数从而创建不同具体产品类的实例

4.外界调用工厂类的静态方法,传入不同参数从而创建不同具体产品类的实例

实例:

实例代码已上传到GitLab,地址:https://gitlab.com/louisvv/DesignPattern

通过一个实例来演示简单工厂模式

背景:有一个水果工厂,用来生产水果,现在有两种水果:苹果、香蕉

目的:通过简单工厂模式实现两种水果的生产

步骤如下:

1.定义抽象产品水果类

public abstract class Fruit {
    public abstract void show();
}

2.定义具体实现产品类,继承抽象产品类

苹果类:

public class Apple extends Fruit{
    public void show(){
        System.out.println("我是苹果");
    }
}

香蕉类:

public class Banana extends Fruit{
    public void show(){
        System.out.println("我是香蕉");
    }
}

3.定义工厂类:

public class FruitFactory {
    public static Fruit getFruit(String fruitType) throws IllegalAccessException, InstantiationException {
        switch (fruitType.toLowerCase()){
            case "apple":
                return new Apple();
            case "banana":
                return new Banana(); default:
                return null;
        }
    }
}

4.定义用户类,外部调用工厂类的静态方法:

public class User {
    public static void main(String[] args) throws Exception {
        try {
            Fruit apple = FruitFactory.getFruit("apple");
            apple.show();
        } catch (NullPointerException e) {
            System.out.println("没有这类水果");
        }

        try {
            Fruit banana = FruitFactory.getFruit("banana");
            banana.show();
        } catch (NullPointerException e) {
            System.out.println("没有这类水果");
        }

        try {
            Fruit peach = FruitFactory.getFruit("peach");
            peach.show();
        } catch (NullPointerException e) {
            System.out.println("没有这类水果");
        }
    }
}

输出结果:

我是苹果
我是香蕉
没有这类水果

优点: 

1.将创建实例的工作与使用实例的工作分开,工厂类中包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。

2.用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。

3.有利于整个软件体系结构的优化。

缺点:

同时,我们会发现一些问题:

1.现有两种水果,当我们工厂新添水果时,需要修改工厂类中的代码,这显然违背了”开放 – 关闭原则”,导致程序逻辑过于复杂。

2.工厂类集中了所有产品(实例)的创建逻辑,违反了高内聚责任分配原则,一旦工厂发生异常,整个系统都会受到影响。

应用场景:

通过对比简单工厂模式的优缺点,简单工厂模式的应用场景如下:

  • 客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时;
  • 当工厂类负责创建的对象(具体产品)比较少时。

由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。

下篇设计模式文章见~

赫墨拉

我是一个喜爱大数据的小菜鸡,这里是我分享我的成长和经历的博客

You may also like...

3 Responses

  1. 匿名说道:

    写得很好,只是为何作者不更新了呢

  2. 首码网说道:

    欢迎各位站长朋友测试本站主题!

发表评论

邮箱地址不会被公开。