【设计模式】工厂模式(Factory Pattern)

1. 概述

工厂模式(Factory Pattern)是最常用的设计模式之一,它属于创建类型的设计模式。它提供了一种创建对象的最佳方式,在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同的接口来指向新创建的对象。

工厂模式(Factory Pattern)是 3 种工厂模式的总成 —— 简单工厂模式(Simple Factory)工厂方法模式(Factory Method)抽象工厂模式(Abstract Factory)

这 3 种模式从上到下逐步抽象,并且具有一般性。用一下案例来理解工厂模式:

(1)在没有工厂的时代,如果用户需要一款宝马车,那么就需要用户自己去创建一款宝马车,即用户自己去执行创建一款宝马车所需要的一系列的复杂的操作,然后才能拿来用;
(2)简单工厂模式:后来出现了工厂,用户不再需要去创建宝马车,由工厂进行创建,即由工厂来执行创建宝马车的一些列复杂的操作,用户不用关心复杂的创建过程,用户想要什么车,直接通过工厂创建就可以了。比如,想要320i系列车,工厂就创建这个系列的车;
(3)工厂方法模式:为了满足不同用户的需求,宝马车推出了越来越多的车系以满足不同用户的需求,如320i系列、523i等等系列。原先一个工厂无法创建所有的宝马车系,于是又单独分出来多个具体的工厂,每个工厂创建一种车系,即具体工厂类只能创建一个具体产品。但是宝马工厂还是个抽象,用户需要指定某个具体的工厂才能生产出他所需要的车。例如,客户需要宝马320i系列的车,那么他就需要执行生产宝马320i系列车的工厂生产一辆他所需要的车;
(4)抽象工厂模式:随着客户要求越来越高,宝马车必须配置空调,于是这个工厂开始生产宝马车和所需要的空调。用户只要提出他需要宝马320i空调车,宝马工厂就直接给他提供宝马320i空调车,而不用自己去创建宝马320i空调宝马车。

 

2. 简单工厂模式

简单工厂模式的核心是定义一个创建对象的接口,讲对象的创建和本身的业务逻辑分离,降低系统的耦合度,使得两个修改起来相对容易些,当以后实现改变时,只需要修改工厂类即可。

如果不使用工厂,用户将需要自己创建宝马车。

public class BMW320 {
    public BMW320() {
        System.out.println("制造-->BMW320");
    }
}

public class BMW523 {
    public BMW523() {
        System.out.println("制造-->BMW523");
    }
}

public class Customer {
    public static void main(String[] args) {
        // 不适用简单工厂模式时,用户需要宝马车,则需要自己去创建
        BMW320 bmw320 = new BMW320();
        BMW523 bmw523 = new BMW523();
    }
}

用户需要知道怎么创建一款车,这样客户和车就紧密耦合在一起了,为了降低耦合性,就出现了简单工厂模式,把创建宝马车的操作细节都放到了工厂里,而客户直接使用工厂的创建方法,传入想要的宝马车型号就行了,而不必去知道创建的细节。

UML类图

【设计模式】工厂模式(Factory Pattern)_第1张图片

  • 工厂类角色:该模式的核心,用来创建产品,含有一定的商业逻辑和判断逻辑
  • 抽象产品角色:它一般是具体产品集成的父类或者实现的接口
  • 具体产品角色:工厂类所创建的对象就是次角色的实例,在JAVA中由一个具体的类实现

代码实现

产品类

public abstract class BMW {

    protected String type;

    public BMW() {
    }

    abstract public String getBMWType();
}

public class BMW320 extends BMW {
    public BMW320() {
        System.out.println("制造-->BMW320");
        type = "BMW320";
    }

    @Override
    public String getBMWType() {
        return type;
    }
}

public class BMW523 extends BMW {
    public BMW523() {
        System.out.println("制造-->BMW523");
    }

    @Override
    public String getBMWType() {
        return type;
    }
}

工厂类

public class BMWFactory {
    public BMW createBMW(String type) {
        switch (type) {
            case "320":
                return new BMW320();
            case "523":
                return new BMW523();
            default:
                break;
        }
        return null;
    }
}

Customer类

public class Customer {
    public static void main(String[] args) {
        BMWFactory bmwFactory = new BMWFactory();
        BMW bmw = bmwFactory.createBMW("320");
        System.out.println("BMW type: " + bmw.getBMWType());
    }
}

测试

【设计模式】工厂模式(Factory Pattern)_第2张图片

 

简单工厂模式优缺点

优点
简单工厂模式提供专门的工厂类用于创建对象,实现了对象创建和使用的职责分离,客户端不需知道所创建的具体产品类的类名以及创建过程,只需要知道具体产品类所对应的参数即可。通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

缺点
缺点在于不符合设计模式的 “开闭原则”(对扩展开放,对修改关闭),每次添加新的产品就需要修改工厂类。在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展维护,并且工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要收到影响。

为了解决简单工厂模式的问题,出现了工厂方法模式。

 

3. 工厂方法模式

 

4. 抽象工厂模式

 

参考文献

你可能感兴趣的:(设计模式,设计模式)