模式概述
- 工厂方法属于创建型模式,描述如何将对象的创建与使用相分离,目的在于让用户使用对象的同时,无需关心对象的创建细节,从而降低系统的耦合度,让设计方案易于修改和扩展。
- 定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。
- 由于简单工厂模式中 用于创建实例的方法是静态的,因此简单工厂模式又被称为
静态工厂模式
- 简单工厂模式的要点在于:用户需要什么时,只需要传入一个正确的参数,就可以获取所需要的对象,而无需知道创建细节。
模式结构
- 工厂类
- 抽象产品类
- 具体产品类
代码实现
需求: 开发一套图表库,可以向用户提供各种图标,例如柱状图(HistogramChart),饼状图(PieChart),折现图(LineChart),并且后期还可以根据需求添加别的图。
- 抽象产品类:
Chart
public interface Chart {
public void display();
}
- 具体产品类:
HistogramChart
,PieChart
,LineChart
public class HistogramChart implements Chart {
public HistogramChart() {
System.out.println("创建柱状图");
}
@Override
public void display() {
System.out.println("显示柱状图");
}
}
public class PieChart implements Chart {
public PieChart() {
System.out.println("创建饼状图");
}
@Override
public void display() {
System.out.println("显示饼状图");
}
}
public class LineChart implements Chart {
public LineChart() {
System.out.println("创建折线图");
}
@Override
public void display() {
System.out.println("显示折线图");
}
}
- 工厂类:
ChartFactory
public class ChartFactory {
//静态工厂方法
public static Chart getChart(String type) {
Chart chart=null;
if(type.equalsIgnoreCase("histogram")) {
chart=new HistogramChart();
System.out.println("初始化设置柱状图!");
}else if(type.equalsIgnoreCase("pie")){
chart=new PieChart();
System.out.println("初始化设置饼状图!");
}else if(type.equalsIgnoreCase("line")){
chart=new LineChart();
System.out.println("初始化设置折线图!");
}
return chart;
}
}
- 测试类:
client
import com.daq.factory.Chart;
import com.daq.factory.ChartFactory;
public class Client {
public static void main(String[] args) {
Chart chart;
chart=ChartFactory.getChart("pie");
chart.display();
}
}
测试结果:
创建饼状图
初始化设置饼状图!
显示饼状图
总结
- 以上就是简单工厂模式的实现,当然也可以将静态工厂方法的参数存储在
XML
配置文件中,然后通过一个工具类XMLUtil
来读取配置文件中的字符串参数。这样就可以实现不用修改源码就可以获取到相应的实例。 - 简单工厂模式也可以简化:将抽象产品类和工厂类合并,将静态工厂方法移动至抽象产品类中。
优缺点
- 优点
①实现了对象创建和使用相分离
②通过引入配置文件,可以不用修改源码,只用修改配置文件,实现更换和增加新的具体产品类。 - 缺点
①工厂类集中了所有产品的创建逻辑,职责过重。一旦不能正常工作,整个系统都会出问题。
②会增加类的个数,增加系统的负担。
③不利于系统的扩展和维护。
④由于是使用静态工厂方法,造成工厂角色无法形成基于继承的等级结构。
应用场景
- 工厂类负责创建的对象比较少,不会造成工厂方法中的业务逻辑过于复杂。
- 客户端只知道传入工厂类的参数,对如何创建对象不关心。