简介:
工厂模式是创建型设计模式的一种,它使用户不必关心具体产品的生产,直接获取想要的结果。工厂模式包括:简单工厂模式,工厂方法模式,抽象工厂模式;对应难度,初级、中级、高级三个不同的难度等级。而常说的工厂模式,通常是指代工厂方法模式。
参考连接
初级:简单工厂模式
以下创建一个简单的表格显示实例,来理解简单工厂模式;
普通实现:
方式一:
/**
* Created by zhangxuehui on 2017/6/9.
* 普通模式,实现图表
*/
public class ChartSimple {
public static void main(String[] args) {
//具体使用
new LineChart().showChart();
new PieChart().showChart();
new ClumnChart().showChart();
}
/**
* 线性图类
*/
public static class LineChart {
public LineChart() {
System.out.println("初始化线型图");
}
public void showChart() {
System.out.println("显示线型图");
}
}
/**
* 饼状图类
*/
public static class PieChart {
public PieChart() {
System.out.println("初始化饼状图");
}
public void showChart() {
System.out.println("显示饼状图");
}
}
/**
* 柱形图类
*/
public static class ClumnChart {
public ClumnChart() {
System.out.println("初始化柱形图");
}
public void showChart() {
System.out.println("显示柱形图");
}
}
}
问题
1.使用那种图表就要创建具体的图表实例;
2.代码冗余,会产生大量重复代码;
3.不便于维护,如改变所有图表的颜色;
4.需要对每一个图表类进行充分的理解;
方式二:
public class ChartUtils {
private int type;
private String data;
public ChartUtils(int type, String data) {
this.type = type;
this.data = data;
}
public String createChart() {
String str = "";
switch (type) {
case 0:
str = createLineTable();
break;
case 1:
str = createPieTable();
break;
default:
str = createclumnTable();
break;
}
return str;
}
private String createLineTable() {
return "线性图";
}
private static String createPieTable() {
return "饼状图";
}
private static String createclumnTable() {
return "柱形图";
}
}
问题
1.代码冗余,没有对图表的公共行为进行提取;
2.违背了开闭原则(对于扩展是开放的,对于修改是关闭的);
3.ChartUtils类中包含表格的创建、绘制、类型判断等,过于复杂,违反了单一原创;
4.需要维护表格的类型,每一种type,对应一种表格,增加了维护成本;
以上问题该如何解决?来看看简单工厂模式
简单工厂模式(Simple Factory Pattern)
概念
定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。
知识要点
用户提出需求,工厂返回结果,用户无需关心具体实现;
标准类图
角色分析
-Factory(工厂角色):是用户直接接触的方法,负责产品实例的创建以及产品逻辑实现。
-Product (抽象产品角色):是所有产品的父类,为工厂提供了公共方法。
-ConcreteProduct (具体产品角色):是产品的具体实现类。
案例分析
1.图表案例类图设计
2.代码实现
//图表接口类
public interface Chart {
//初始化图表
void init();
//显示图表
public void show();
}
//饼状图类
public class PieChart implements Chart {
public PieChart() {
init();
}
@Override
public void init() {
System.out.println("初始化饼状图");
}
@Override
public void show() {
System.out.println("显示饼状图");
}
}
//线性图类
public class LineChart implements Chart {
public LineChart() {
init();
}
@Override
public void init() {
System.out.println("初始化线性图");
}
@Override
public void show() {
System.out.println("显示线性图");
}
}
//柱形图类
public class ClumnChart implements Chart{
public ClumnChart() {
init();
}
@Override
public void init() {
System.out.println("初始化柱形图");
}
@Override
public void show() {
System.out.println( "显示柱形成");
}
}
//简单工厂类
public class ChartFactory {
public static final int CHART_LINE = 100; //线性图
public static final int CHART_PIE = 101; //饼状图
public static final int CHART_CLUMN = 102; //柱形图
public static Chart getChart(int type) {
Chart chart;
if (type == CHART_LINE) {
chart = new LineChart();
} else if (type == CHART_PIE) {
chart = new PieChart();
} else {
chart = new ClumnChart();
}
return chart;
}
}
//具体实现类
public class UserChart {
public static void main(String[] args) {
//显示图表
ChartFactory.getChart(ChartFactory.CHART_CLUMN).show();
}
}
总结
简单工厂模式,有如下几个优点:
1.耦合性低,将用户和产品进行分类;
2.单一入口,减少记忆量;
3.遵循开闭原则,使用不需要修改相关代码;
缺点如下:
1.不方便拓展,新增图表需要修改除抽象产品之外的所有代码;
2.随着产品的增加,工厂类的逻辑复杂度也会增加;
使用场景
产品类型基本固定,用户会经常切换产品的场景;
例如:android中的图片三级缓存、GreenDao 数据类型的切换等