设计模式学习笔记(四):简单工厂模式

1 定义

简单工厂模式(Simple Factory Pattern):定义一个工厂类,它能够根据参数的不一样返回不一样类的实例,被建立的实例一般都具备共同的父类。java

由于在简单工厂模式用于建立实例的方法是静态的方法,所以简单工厂模式又被称为静态工厂方法模式,它属于类建立型模式。设计模式

尽管简单工厂模式不属于GoF23种设计模式之一,可是实际中用途普遍,而且能够做为学习“工厂方法模式”以及“抽象工厂模式”的基础。ide

2 结构

在这里插入图片描述

由图可知包含如下三个角色:学习

  • Factory(工厂角色):即工厂类,负责实现建立全部产品实例的内部逻辑,工厂类能够被外界直接调用,建立所须要的产品对象,在工厂类中提供了一个静态工厂方法用于获取产品
  • Product(抽象产品角色):是工厂类所建立的全部对象的父类,封装了各类产品对象的公有方法。Product会提升系统的灵活性,使得在工厂类只须要定义一个通用的工厂产品方法,由于全部建立的具体产品都是其子类对象
  • ConcreteProduct(具体产品角色):全部被建立的对象都充当这个角色的某个具体类的实例。每个具体产品角色都继承了抽象产品角色,须要实如今抽象产品中声明的抽象方法

3 实例

某公司须要开发一个图表库,该图表库能够提供各类不一样外观的图表,例如柱状图,折线图等等。测试

首先能够先设计一个抽象图表类(这里是一个接口):优化

interface Chart
{
    void display();
}

接着各类具体产品类(柱状图,折线图,饼状图等)实现该接口便可:设计

class HistogramChart implements Chart
{
    public HistogramChart()
    {
        System.out.println("建立柱状图");
    }

    public void display()
    {
        System.out.println("显示柱状图");
    }
}

class PieChart implements Chart
{
    public PieChart()
    {
        System.out.println("建立饼状图");
    }

    public void display()
    {
        System.out.println("显示饼状图");
    }
}

class LineChart implements Chart
{
    public LineChart()
    {
        System.out.println("建立折线图");
    }

    public void display()
    {
        System.out.println("显示折线图");
    }
}

最后是工厂类,为了方便加上了枚举参数:code

class Factory
{
    public static Chart getChart(Charts charts)
    {
        switch(charts)
        {
            case PIE_CHART:
                return new PieChart();
            case LINE_CHART:
                return new LineChart();
            case HISTOGRAM_CHART:
                return new HistogramChart();
            default:
                return null;
        }
    }
}

enum Charts
{
    PIE_CHART,LINE_CHART,HISTOGRAM_CHART;
}

测试:xml

public static void main(String[] args) {
    Chart chart = Factory.getChart(Charts.LINE_CHART);
    chart.display();
}

在这里插入图片描述

4 简化

为了简化简单工厂模式,能够将抽象产品类与工厂类合并,将静态方法移至抽象产品类中:对象

在这里插入图片描述

这样能够经过抽象产品类的静态方法获取子类对象,优化代码以下:

interface Chart
{
    void display();
    static Chart getChart(Charts charts)
    {
        switch(charts)
        {
            case PIE_CHART:
                return new PieChart();
            case LINE_CHART:
                return new LineChart();
            case HISTOGRAM_CHART:
                return new HistogramChart();
            default:
                return null;
        }
    }
}

5 主要优势

简单工厂模式的主要优势以下:

  • 分离职责:简单工厂模式实现了对象建立以及使用的分离,工厂类包含必要的判断逻辑,能够决定在何时建立什么哪个产品的实例,客户端能够免除直接建立产品对象的职责,仅仅是“消费”产品
  • 简化记忆:客户端无须知道具体产品类的名字,只须要知道对应的参数便可,通常使用常量字符串或者枚举
  • 提升灵活性:能够引入配置文件(xml等)在不修改客户端代码状况下增长新的具体产品类,提升灵活性

6 主要缺点

简单工厂模式的主要缺点以下:

  • 工厂类集中了全部产品的建立逻辑,一旦不能正常工做,整个系统都要受影响
  • 因为引入了工厂类会增长系统中类的个数,会增长系统的复杂度和理解难度
  • 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型过多时,有可能形成工厂逻辑过于复杂,不利于系统的扩展和维护
  • 简单工厂模式使用了静态工厂方法,形成工厂角色没法基于继承的等级结构

7 适用场景

  • 工厂类负责建立的对象比较少,因为建立对象较少,不会形成工厂方法中的业务逻辑太过复杂
  • 客户端只须要知道传入工厂类的参数,对如何建立对象不关心

8 总结

在这里插入图片描述

相关文章
相关标签/搜索