创建性模式及简单工厂模式详解

文章目录

  • 前言
  • 一、创建型模式
  • 二、简单工厂模式概述
  • 三、简单工厂模式结构与实现
    • 简单工厂模式结构
    • 简单工厂模式实现
  • 简单工厂模式的优缺点与适用环境
    • 优点
    • 缺点
    • 适用环境


前言

创建型模式关注对象的创建过程,试一类最常见的设计模式,在软件开发中的应用非常广泛。创建型模式描述如何将对象的创建和使用分离,让用户在使用对象时无须关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展。

简单工厂模式是最简单的设计模式之一,它虽然不属于GoF的23种设计模式,但是应用仍较为频繁,同时它是学习其他创建型模式的基础,在简单工厂模式中只需要记住一个简单的参数即可获得所需的对象实例,它提供专门的核心工厂来负责对象的创建,实现对象创建和使用的分离。


提示:以下是本篇文章正文内容

一、创建型模式

软件系统在运行时类将实例化成对象,并由这些对象来协作完成各项业务功能。创建型模式关注对象的创建过程,是一类最常用的设计模式,在软件开发中的应用非常广泛。创建型模式对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离,对用户隐藏了类的实例的创建细节。
创建型模式描述如何将对象的创建和使用分离,让用户在使用对象时无须关心对象的创建细节,从而降低系统的耦合度。让设计方案更易于修改和扩展。每一个创建型模式都通过采用不同的解决方案来回答3个问题,即创建什么、由谁创建和何时创建。
下文给出6种设计模式的名称及定义:

  1. 简单工厂模式:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类
  2. 工厂方法模式:定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类
  3. 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类
  4. 建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
  5. 原型模式:使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象
  6. 单例模式:确保一个类只有一个实例,并且提供一个全局访问点来访问这个唯一实例

二、简单工厂模式概述

考虑一个水果农场,当用户需要某一种水果时该农场能够根据用户所提供的水果名称返回该水果。在此,水果农场被称为工厂,而生成的水果被称为产品,水果的名称被称为参数,工厂可以根据参数的不同返回不同的产品。
创建性模式及简单工厂模式详解_第1张图片
由于在简单工厂模式中用于创建实例的方法通常时静态方法,因此简单工厂模式又被称为静态工厂方法模式,它是一种类创建型模式。简单工厂模式的要点在于当用户需要什么时,只需要传入一个正确的参数就可以获取所需要的对象,而无需知道其创建细节。

三、简单工厂模式结构与实现

简单工厂模式结构

其结构如下图所示:
创建性模式及简单工厂模式详解_第2张图片

  • Factory(工厂类):它是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑;工厂类可以被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法,它的返回类型为抽象产品类型Product。
  • Product(抽象产品角色):它是工厂类创建的所有对象的父类,封装了各种产品对象的公有方法,它的引入将提高系统的灵活性,使得工厂类只需定义一个通用的工厂方法,因为所有具体的产品对象都是其子类对象。
  • ConcreteProduct(具体产品角色):它是简单工厂模式的创建目标,所有被创建的对象都充当了这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现在抽象产品中声明的抽象方法。

简单工厂模式实现

在简单工厂模式中需根据实际情况设计一个产品层次结构,将所有产品类公共的代码移至抽象产品类,并在抽象产品类中声明一些抽象方法,以供不同的具体产品类来实现。
示例代码如下:

public abstract class Produt{
    //所有产品类的公共业务类方法
    public void methodSame(){
        //公共方法的实现
    }
    //声明抽象业务方法
    public abstract void methodDiff();
}

在具体产品类中实现了抽象产品类中声明的抽象业务方法,不同的具体产品类可以提供不同的实现。典型的具体产品类的代码如下:

public class ConcreteProduct extends Product{
    //实现业务方法
    public void sethodDiff(){
        //业务方法的实现
    }
}

简单工厂模式的核心是工厂类,在没有工厂类之前客户端一般会使用new关键字来直接创建产品对象,而在引入工厂类之后客户端可以通过工厂类来创建产品,在简单工厂模式中工厂类提供了一个静态工厂方法供客户端使用,根据所传入的参数不同可以创建不同的产品对象,典型的工厂类的代码如下:

public class Factory{
    public static Product getProduct(String arg){
        Product product=null;
        if (arg.equalsIgnoreCase("A")){
            product =new ConcreteProductA();
            //初始化设置product
        }
        else if (arg.equalsIgnoreCase("B")) {
            product = new ConcreteProductB();
            //初始化设置product
        }
        return product;
    }
}

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

优点

简单工厂模式的优点:

  1. 工厂类包含必要的判断逻辑,可以决定在上面时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的职责,而仅仅“消费”产品,简单工厂模式实现了对象创建和使用的分离。
  2. 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以在一定程度上减少使用者的记忆量。
  3. 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

缺点

  1. 工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响。
  2. 使用简单工厂模式势必会增加系统中类的个数(引入了新的工厂类),增加了系统的复杂度和理解难度。
  3. 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
  4. 简单工厂模式由于使用了静态工厂方法,造成了工厂角色无法形成基于继承的等级结构。

适用环境

  1. 工厂类负责创建的对象比较少,由于创建的对象比较少,不会造成 工厂方法中的业务逻辑太过复杂。
  2. 客户端只知道传入工厂类的参数,对于如何创建对象并不关心。

你可能感兴趣的:(Java,简单工厂模式,java,设计模式,工厂方法模式)