创建型---简单工厂模式

模式概述

  • 工厂方法属于创建型模式,描述如何将对象的创建与使用相分离,目的在于让用户使用对象的同时,无需关心对象的创建细节,从而降低系统的耦合度,让设计方案易于修改和扩展。
  • 定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。
  • 由于简单工厂模式中 用于创建实例的方法是静态的,因此简单工厂模式又被称为静态工厂模式
  • 简单工厂模式的要点在于:用户需要什么时,只需要传入一个正确的参数,就可以获取所需要的对象,而无需知道创建细节。

模式结构

  • 工厂类
  • 抽象产品类
  • 具体产品类

代码实现

需求: 开发一套图表库,可以向用户提供各种图标,例如柱状图(HistogramChart),饼状图(PieChart),折现图(LineChart),并且后期还可以根据需求添加别的图。

  1. 抽象产品类: Chart
public interface Chart {
	public void display();
}
  1. 具体产品类: HistogramChartPieChartLineChart
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("显示折线图");
	}
}
  1. 工厂类: 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;
	}
}
  1. 测试类: 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来读取配置文件中的字符串参数。这样就可以实现不用修改源码就可以获取到相应的实例。
  • 简单工厂模式也可以简化:将抽象产品类和工厂类合并,将静态工厂方法移动至抽象产品类中。

优缺点

  • 优点
    ①实现了对象创建和使用相分离
    ②通过引入配置文件,可以不用修改源码,只用修改配置文件,实现更换和增加新的具体产品类。
  • 缺点
    ①工厂类集中了所有产品的创建逻辑,职责过重。一旦不能正常工作,整个系统都会出问题。
    ②会增加类的个数,增加系统的负担。
    ③不利于系统的扩展和维护。
    ④由于是使用静态工厂方法,造成工厂角色无法形成基于继承的等级结构。

应用场景

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

猜你喜欢

转载自blog.csdn.net/weixin_44861399/article/details/105806753