简单工厂(SimpleFactory)模式简介
簡單工廠模式是最簡單的模式了,也是我們打開教材的第一個(gè)模式.
一, 簡單工廠模式的定義.
簡單工廠模式是這樣的:
建立1個(gè)工廠類, 這個(gè)類有1個(gè)靜態(tài)方法, 根據(jù)條件(參數(shù))的不同返回不同的同1個(gè)類族的對象.
也就是工廠的產(chǎn)品是對象.
但是這種些對象可以屬于不同的類,
但是它們的類通常是屬于同一超類或?qū)崿F(xiàn)同一 接口的子類.
比如:?? 1個(gè)工廠類F,? 它有1個(gè)靜態(tài)方法getObj(有參數(shù))
getObj可以返回類A1的對象a1, 也可以返回類A2 的對象a2. 但是通常A1 和 A2屬于同1個(gè)類A.
二, 簡單工廠模式的意義.
這里先寫個(gè)總結(jié). 后面再舉例子詳細(xì)解釋意義就是.
根據(jù)上面的例子
1. 當(dāng)你讓程序猿修改類A1, 不會(huì)暴露A2的代碼. 方便項(xiàng)目管理
2. 當(dāng)你想添加業(yè)務(wù)時(shí), 只需要增加子類A3, 不用修改上層A的代碼.? 方便擴(kuò)展
(項(xiàng)目中上層類可能用jar包發(fā)布, 或者你沒有權(quán)限)
三, 例子
這個(gè)例子很簡單, 就是做1個(gè)簡單的計(jì)算器, 只有加法和剪發(fā). 界面大概是這樣的:
簡單來講, 就是讓User輸入2個(gè)integer,? 然后按button + 就是顯示和, 按button "-" 就顯示差
3.1 不使用任何模式
當(dāng)然, 業(yè)務(wù)和界面代碼分開是最基本的要求.
有些人是這樣寫的:
業(yè)務(wù)類: Operator1
public class Operation1 {private int i;private int j;public Operation1(int i, int j){this.i = i;this.j = j;}private int add(){return i + j;}private int del(){return i - j;}public int getResult(String symbol){switch(symbol){case "+": return add();case "-": return del();}return 0;} }界面代碼是這樣的:
private void BtnClicked_btnDel(){int i = Integer.parseInt(tb_i.getText());int j = Integer.parseInt(tb_j.getText());lblResult.setText("" + new Operation1(i,j).getResult("-"));} } private void BtnClicked_btnAdd(){int i = Integer.parseInt(tb_i.getText());int j = Integer.parseInt(tb_j.getText());lblResult.setText("" + new Operation1(i,j).getResult("+"));} }上面的寫法是可行的. 但是擴(kuò)展性不好.
假如我想增加1個(gè)button "*" 乘法,? 那么我們必須修改類Operation1 添加1個(gè)方法mul(),(以及getResult())
這就導(dǎo)致兩個(gè)問題.
1.暴露了加法和減法是如何實(shí)現(xiàn)的.
2. 有可能Operation類不能修改.
3.2 使用簡單工廠(SimpleFactory)模式
定義1個(gè)抽象超類 Operation
public abstract class Operation {private int i;private int j;public int getI(){return i;}public int getJ(){return j;}public Operation(int i, int j){this.i = i;this.j = j;}public abstract int getResult(); }那么它的子類就必須重寫getResult方法.
定義加法類. OperationAdd
public class OperationAdd extends Operation{public OperationAdd(int i, int j) {super(i, j);// TODO Auto-generated constructor stub}@Overridepublic int getResult(){return this.getI() + this.getJ();} }減法類OperationDel
public class OperationDel extends Operation{public OperationDel(int i, int j) {super(i, j);// TODO Auto-generated constructor stub}@Overridepublic int getResult(){return this.getI() - this.getJ();} }好了, 這是再定義1個(gè)工廠類, 這個(gè)工廠的產(chǎn)品就是Operation的子類對象. public class OperationFactory {public static Operation getOperationObj(int i, int j, String symbol){switch(symbol){case "+": return new OperationAdd(i, j);case "-": return new OperationDel(i, j);}return null;} }
客戶端關(guān)鍵代碼:
UML:
咋一看, 這里用到4個(gè)類, 分別是1個(gè)超類, 1個(gè)加法類, 1個(gè)減法類, 一個(gè)工廠類. 貌似更加復(fù)雜啦.
但是, 實(shí)際上它的可擴(kuò)展性更好.
首先, 修改減法類, 不會(huì)暴露加法類.
其次, 很方便地增加乘法功能.?? 只需增加1個(gè)乘法類, 及修改工廠類.??? 即使其他3個(gè)類用jar包發(fā)布也沒關(guān)系, 根本沒必要修改它們.
四, 開放-封閉原則(open-closed principle)
有人問,? 貌似在方法1里Operation1類里增加1個(gè)乘法方法不是更加方便嗎?
方法2里需要增加1個(gè)新的類啊.
先不考慮你能不能修改基類的問題.
增加業(yè)務(wù)的話,? 增加表是優(yōu)于修改舊表(增加列)的.
設(shè)計(jì)模式同樣,? 如果要增加功能,?? 增加1個(gè)類, 比修改舊類要好.
因?yàn)檫@符合開放封閉原則.
所謂開放-封閉原則就是, 對擴(kuò)展開放, 對修改封閉.
程序猿在做prj時(shí), 往往做到大半時(shí),? 遇到User改需求了,?? 雖然需求改動(dòng)看起來很小, 實(shí)際上對程序影響很大,? 甚至要重新翻工.
發(fā)生這種痛苦的事情就是在程序設(shè)計(jì)時(shí)對擴(kuò)展性考慮得不足.
在理想狀態(tài)下, 我們做設(shè)計(jì)時(shí), 盡量做到客戶無論怎樣修改或添加需求.
我們原來的代碼(基類)都不用修改, 只需增加新的代碼(新的子類)就ok了,? 也就是讓新代碼去完成新的功能.
這就是所謂的開放-封閉原則.?? 在java設(shè)計(jì)模式中, 無論是哪個(gè)模式, 實(shí)際上都是為了實(shí)現(xiàn)這個(gè)原則而存在的.
總結(jié)
以上是生活随笔為你收集整理的简单工厂(SimpleFactory)模式简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java内部类简介.
- 下一篇: 策略模式(Strategy)简介