簡介:
工廠模式是創(chuàng)建型設(shè)計模式的一種,它使用戶不必關(guān)心具體產(chǎn)品的生產(chǎn),直接獲取想要的結(jié)果。工廠模式包括:簡單工廠模式,工廠方法模式,抽象工廠模式;對應(yīng)難度,初級、中級、高級三個不同的難度等級。而常說的工廠模式,通常是指代工廠方法模式。
參考連接
初級:簡單工廠模式
以下創(chuàng)建一個簡單的表格顯示實例,來理解簡單工廠模式;
普通實現(xiàn):
方式一:
/**
* Created by zhangxuehui on 2017/6/9.
* 普通模式,實現(xiàn)圖表
*/
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.使用那種圖表就要創(chuàng)建具體的圖表實例;
2.代碼冗余,會產(chǎn)生大量重復(fù)代碼;
3.不便于維護(hù),如改變所有圖表的顏色;
4.需要對每一個圖表類進(jìn)行充分的理解;
方式二:
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.代碼冗余,沒有對圖表的公共行為進(jìn)行提取;
2.違背了開閉原則(對于擴(kuò)展是開放的,對于修改是關(guān)閉的);
3.ChartUtils類中包含表格的創(chuàng)建、繪制、類型判斷等,過于復(fù)雜,違反了單一原創(chuàng);
4.需要維護(hù)表格的類型,每一種type,對應(yīng)一種表格,增加了維護(hù)成本;
以上問題該如何解決?來看看簡單工廠模式
簡單工廠模式(Simple Factory Pattern)
概念
定義一個工廠類,它可以根據(jù)參數(shù)的不同返回不同類的實例,被創(chuàng)建的實例通常都具有共同的父類。因為在簡單工廠模式中用于創(chuàng)建實例的方法是靜態(tài)(static)方法,因此簡單工廠模式又被稱為靜態(tài)工廠方法(Static Factory Method)模式,它屬于類創(chuàng)建型模式。
知識要點
用戶提出需求,工廠返回結(jié)果,用戶無需關(guān)心具體實現(xiàn);
標(biāo)準(zhǔn)類圖

角色分析
-Factory(工廠角色):是用戶直接接觸的方法,負(fù)責(zé)產(chǎn)品實例的創(chuàng)建以及產(chǎn)品邏輯實現(xiàn)。
-Product (抽象產(chǎn)品角色):是所有產(chǎn)品的父類,為工廠提供了公共方法。
-ConcreteProduct (具體產(chǎn)品角色):是產(chǎn)品的具體實現(xiàn)類。
案例分析
1.圖表案例類圖設(shè)計

2.代碼實現(xiàn)
//圖表接口類
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;
}
}
//具體實現(xiàn)類
public class UserChart {
public static void main(String[] args) {
//顯示圖表
ChartFactory.getChart(ChartFactory.CHART_CLUMN).show();
}
}
總結(jié)
簡單工廠模式,有如下幾個優(yōu)點:
1.耦合性低,將用戶和產(chǎn)品進(jìn)行分類;
2.單一入口,減少記憶量;
3.遵循開閉原則,使用不需要修改相關(guān)代碼;
缺點如下:
1.不方便拓展,新增圖表需要修改除抽象產(chǎn)品之外的所有代碼;
2.隨著產(chǎn)品的增加,工廠類的邏輯復(fù)雜度也會增加;
使用場景
產(chǎn)品類型基本固定,用戶會經(jīng)常切換產(chǎn)品的場景;
例如:android中的圖片三級緩存、GreenDao 數(shù)據(jù)類型的切換等