创建型模式

创建型模式对类的实例化过程进行了抽象,能够将软件模式中对象的创建和对象的使用分离,对用户隐藏了类的实例的创建细节。

创建型模式描述了如何将对象的创建和使用分离,让用户在使用对象时无需关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展。

简单工厂模式概述

简单工厂模式:定义一个工厂类,它可以根据参数的不同返回不同类的示例,被创建的实例通常都具有共同的父类。

由于在简单工厂模式中用于创建实例的方法通常是静态方法,因此简单工厂模式又被称为静态工厂方法模式,它是一种创建型模式。

简单工厂模式的要点在于用户需要什么时,只需要传入一个正确的参数就可以获取所需要的对象,而无需知道其创建细节。

简单工厂模式结构与实现

简单工厂模式结构

简单工厂模式包含以下三个角色

Factory(工厂角色):工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑;工厂类可以被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法factoryMethod(),它的返回类型为抽象产品类型Product。

Product(抽象产品角色):他是工厂类创建的所有对象的父类,封装了各种产品对象的公有方法,它的引入将提高系统的灵活性,使得在工厂类中只需要定义一个通用的工厂方法,因为所有创建的具体产品独享都是其子类对象。

ConcerteProduct(具体产品角色):它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例,每一个具体产品角色都继承了抽象产品角色,需要实现现在抽象产品中声明的抽象方法。

简单工厂模式实现

以下以形状生成为例,展示简单工厂模式的实现:

1. 抽象产品:Shape接口

定义所有形状的公共行为(如绘制):

// 抽象产品:形状接口 
public interface Shape {  
    void draw(); // 绘制方法 
}

2. 具体产品:实现抽象产品

创建三种具体形状(圆形、方形、三角形):

// 具体产品:圆形 
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("绘制圆形");
    }
}

// 具体产品:方形 
public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("绘制方形");
    }
}

// 具体产品:三角形 
public class Triangle implements Shape {
    @Override
    public void draw() {
        System.out.println("绘制三角形");
    }
}

3. 工厂类:ShapeFactory

根据参数创建对应形状的实例:

// 工厂类:形状工厂
public class ShapeFactory {
    // 静态方法:根据类型创建产品 
    public static Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        // 根据参数判断创建哪种产品 
        switch (shapeType.toLowerCase()) {
            case "circle":
                return new Circle();
            case "square":
                return new Square();
            case "triangle":
                return new Triangle();
            default:
                throw new IllegalArgumentException("不支持的形状类型:" + shapeType);
        }
    }
}

4. 客户端调用

通过工厂类获取产品并使用:

// 客户端测试类
public class Client {
    public static void main(String[] args) {
        // 通过工厂类获取圆形产品
        Shape circle = ShapeFactory.getShape("circle");
        circle.draw(); // 输出:绘制圆形

        // 获取方形产品
        Shape square = ShapeFactory.getShape("square");
        square.draw(); // 输出:绘制方形

        // 获取三角形产品
        Shape triangle = ShapeFactory.getShape("triangle");
        triangle.draw(); // 输出:绘制三角形
    }
}

关于创建对象和使用对象

素有工厂模式都强调一点:两个类A和B之间的关系应该仅仅是A创建B或是A使用B,而不能两种关系都有。将对象的创建和使用分离,是的系统更加符合单一职责原则,有利于功能的复用和系统的维护。

将对象的创建和使用分离还有一个好处:防止用来实例化一个类的数据和代码在多个类中到处都是,可以将有关创建的知识搬移到一个工厂类中。

但是并不需要为系统中的每一个类都配备一个工厂类,如果一个类很简单,而且不存在太多变化,其构造过程很简单,此时就无需为其提供工厂类,直接在使用之前实例化即可。

简单工厂模式的简化

有时候,为了简化简单工厂模式,可以将抽象产品类和工厂类合并,将静态工厂方法移至抽象产品类中。

简单工厂模式优缺点与适用环境

优点 缺点
客户端与产品实现解耦,无需知道产品创建细节 违反开闭原则:新增产品需修改工厂类代码
集中管理产品创建逻辑,便于维护 工厂类职责过重,若产品类型过多会导致代码臃肿
客户端调用简单,只需传入参数即可获取产品 扩展性差,不适用于产品类型频繁变化的场景

适用场景

  • 产品类型较少且不会频繁新增时(如固定几种支付方式:微信、支付宝、银行卡);
  • 客户端不需要知道产品创建过程,只需结果时;
  • 希望集中管理产品创建逻辑,避免代码重复时。