乐趣区

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

1 定义

简略工厂模式(Simple Factory Pattern):定义一个工厂类,它能够依据参数的不同返回不同类的实例,被创立的实例通常都具备独特的父类。

因为在简略工厂模式用于创立实例的办法是动态的办法,因而简略工厂模式又被称为动态工厂办法模式,它属于类创立型模式。

只管简略工厂模式不属于 GoF23 种设计模式之一,然而理论中用处宽泛,并且能够作为学习“工厂办法模式”以及“形象工厂模式”的根底。

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("显示折线图");
    }
}

最初是工厂类,为了不便加上了枚举参数:

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;}

测试:

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 总结

退出移动版