概念
定义一个工厂类,它可以根据参数的不用返回不同类的实例,被创建的实例通常都具有共同的父类。由于简单工厂模式中用于创建实例的方法通常是静态的,因此又称为静态工厂方法模式。
实例
其实简单工厂模式对于普通开发者使用频率还是很高的,也很容易理解。
场景:
统计数据业务中,我们通常会需要使用到不同类型的图表去直观的展示数据,我们完全可以通过不同的参数生成不同的图标,如柱状图、折线图、饼状图等等。此场景下,我们完全使用简单工厂模式,对其进行简单的设计。
首先我们需要定义一个抽象图表接口,这里我们基于Java进行设计
public interface Chart{
public void display();
}
接下来,我们需要帮不同类型的图表接口实现
- 柱状图 HistogramChart
public class HistogramChart implements Chart {
public HistogramChart() {
System.out.println("柱状图创建");
}
public void display() {
System.out.println("显示柱状图");
}
}
- 折线图 LIneChart
public class LineChart implements Chart {
public LineChart() {
System.out.println("折线图创建");
}
public void display() {
System.out.println("显示折线图");
}
}
- 饼状图 PieChart
public class PieChart implements Chart {
public PieChart() {
System.out.println("饼状图创建");
}
public void display() {
System.out.println("显示饼状图");
}
}
最后,我们需要一个工厂,通过不同的参数传入,创建不同的图表对象
public class ChartFactory {
public static Chart getChart(String type){
Chart chart = null;
if (type.equalsIgnoreCase("histogram")) {
chart = new HistogramChart();
}else if (type.equalsIgnoreCase("line")) {
chart = new LineChart();
}else if (type.equalsIgnoreCase("pie")) {
chart = new PieChart();
}
return chart;
}
}
客户端调用
public class Client {
public static void main(String args[]) {
Chart chart;
chart = ChartFactory.getChart("histogram");
//chart = ChartFactory.getChart("line");
//chart = ChartFactory.getChart("pie");
chart.display();
}
}
以上就是简单工厂方法的实际应用实例。我们不难发现,对于简单工厂模式,它们的结构模式包括:
- 抽象产品角色(Product),它是工厂类创建的所有对象的父类,封装了各种产品对象的公有方法,可以提高系统的灵活性,如上面例子中的Chart。
- 具体产品角色(ConcreteProduct),是抽象产品角色的具体实现,如上例中的HistogramChart、LineChart、PieChart。
- 工厂角色(Factory),负责实现创建所有产品实例的内部逻辑,返回类型为抽象产品角色。如上例中的ChartFactory 。
缺点
其实对于我们日常使用过程中,我们需要根据自身实际业务选择对应的设计模式,每一种设计模式都拥有自己的优缺点,对于简单工厂模式的缺点有一下几点需要注意
- 工厂类中拥有所有产品的实现都创建逻辑,如果出现问题,那么将影响整个系统。
- 过于复杂的业务,会增加系统中类的个数,如果引入过多,会增加负责度和理解难度。
- 当业务复杂度逐渐增大,很大可能会对原有的工厂进行逻辑调整,扩展性比较差。
- 由于简单工厂模式的特点——静态方法,导致工厂角色无法形成继承的等级结构。
适用环境
- 业务复杂度低,需要通过工厂创建的对象比较少。
一问三不知
- 关于简单工厂模式,以下不正确的解释是()。
A. 简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类
B. 简单工厂模式可以根据参数的不同返回不同的产品类的实例
C. 系统的扩展性困难,在添加新的产品时需要修改工厂的业务逻辑
D. 简单工厂模式可以减少系统中类的个数,简化系统的设计,让系统更易于理解
答案将在下一篇公布…*