有感於設計模式在日常開發中的重要性,同時筆者也自覺對設計模式小有心得,故筆者寫23種設計模式的簡單例子、並整理23種設計模式的理論部分,綜合彙總成這份Java設計模式,希望對大家有所幫助。
本份博客主要是爲了向讀者介紹23種設計模式,包括模式的描述,適用性,模式的組成部分,並附帶有簡單的例子和類,目的是爲了讓讀者瞭解23種設計模式,並能方便的查閱各種設計模式的用法及注意點。
所附的例子非常簡單,慢慢的引導讀者從淺到深瞭解設計模式,並能從中享受設計的樂趣。由於每個人對設計模式的理解都不盡一致,因此,可能本文檔的例子有不恰當的地方,還望各位讀者指出不恰當的地方。
在創建模式中一共有:FactoryMethod ( 工廠方法 ) 、AbstractFactory( 抽象工廠 ) 、Singleton ( 單態模式 ) 、Builder ( 建造者模式 ) 、Prototype ( 原型模式 ) 五種,也是最常用的五種設計模式。
首先介紹FactoryMethod ( 工廠方法 ) 。在FactoryMethod ( 工廠方法 ) 中首先定義一個用於創建對象的接口,讓子類決定實例化哪一個類。FactoryMethod使一個類的實例化延遲到其子類。
FactoryMethod ( 工廠方法 ) 的適用性:
1.當一個類不知道它所必須創建的對象的類的時候。
2.當一個類希望由它的子類來指定它所創建的對象的時候。
3.當類將創建對象的職責委託給多個幫助子類中的某一個,並且你希望將哪一個幫助子類是代理者這一信息局部化的時候。
FactoryMethod ( 工廠方法 ) 的參與者:
1.Product
定義工廠方法所創建的對象的接口
2.ConcreteProduct
實現Product接口。
3.Creator
聲明工廠方法,該方法返回一個Product類型的對象。Creator也可以定義一個工廠方法的缺省實現,它返回一個缺省的ConcreteProduct對象。可以調用工廠方法以創 建一個Product對象。
4.ConcreteCreator
重定義工廠方法以返回一個ConcreteProduct實例。
FactoryMethod ( 工廠方法 ) 的類圖:
product
package com.juluce.factoryMethod;
/**
* <b>Application name:</b> FactoryMethod.java <br>
* <b>Application describing:</b> <br>
* <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有。<br>
* <b>Company:</b> <br>
* <b>Date:</b>2013-5-23<br>
* @author 江南漁翁
* @version $Revision$
*/
public interface Work {
public void doWork();
}
ConcreteProduct
package com.juluce.factoryMethod;
/**
* <b>Application name:</b> StudentWork.java <br>
* <b>Application describing:</b> <br>
* <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有。<br>
* <b>Company:</b> <br>
* <b>Date:</b>2013-5-23<br>
*
* @author 江南漁翁
* @version $Revision$
*/
public class StudentWork implements Work {
/**
* {方法功能中文描述}
*
* @author:江南漁翁
*/
@Override
public void doWork() {
System.out.println("學生做作業!");
}
}
package com.juluce.factoryMethod;
/**
* <b>Application name:</b> TeacherWork.java <br>
* <b>Application describing:</b> <br>
* <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有。<br>
* <b>Company:</b> <br>
* <b>Date:</b>2013-5-23<br>
*
* @author 江南漁翁
* @version $Revision$
*/
public class TeacherWork implements Work {
/**
* {方法功能中文描述}
*
* @author:江南漁翁
*/
@Override
public void doWork() {
System.out.println("老師審批作業!");
}
}
Creator
package com.juluce.factoryMethod;
/**
* <b>Application name:</b> IWorkFactory.java <br>
* <b>Application describing:</b> <br>
* <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有。<br>
* <b>Company:</b> <br>
* <b>Date:</b>2013-5-23<br>
*
* @author 江南漁翁
* @version $Revision$
*/
public interface IWorkFactory {
public Work getWork();
}
ConcreteCreator
package com.juluce.factoryMethod;
/**
* <b>Application name:</b> StudentWorkFactory.java <br>
* <b>Application describing:</b> <br>
* <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有 ©<br>
* <b>Company:</b> <br>
* <b>Date:</b>2013-5-23<br>
*
* @author 江南漁翁
* @version $Revision$
*/
public class StudentWorkFactory implements IWorkFactory {
/**
* {方法功能中文描述}
*
* @return
* @author:江南漁翁
*/
@Override
public Work getWork() {
return new StudentWork();
}
}
package com.juluce.factoryMethod;
/**
* <b>Application name:</b> TeacherWorkFactory.java <br>
* <b>Application describing:</b> <br>
* <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有。<br>
* <b>Company:</b> <br>
* <b>Date:</b>2013-5-23<br>
*
* @author 江南漁翁
* @version $Revision$
*/
public class TeacherWorkFactory implements IWorkFactory {
/**
* {方法功能中文描述}
*
* @return
* @author:江南漁翁
*/
@Override
public Work getWork() {
return new TeacherWork();
}
}
Test
package com.juluce.factoryMethod;
/**
* <b>Application name:</b> Test.java <br>
* <b>Application describing:</b> <br>
* <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有。<br>
* <b>Company:</b> <br>
* <b>Date:</b>2013-5-23<br>
*
* @author 江南漁翁
* @version $Revision$
*/
public class Test {
public static void main(String[] args) {
IWorkFactory studentWorkFactory = new StudentWorkFactory();
Work studentWork = studentWorkFactory.getWork();
studentWork.doWork();
IWorkFactory teacherWorkFactory = new TeacherWorkFactory();
Work teacherWork = teacherWorkFactory.getWork();
teacherWork.doWork();
}
}
result
學生做作業!
老師審批作業!
形象比喻:
FACTORY METHOD—請MM去麥當勞喫漢堡,不同的MM有不同的口味,要每個都記住是一件煩人的事情,我一般採用FactoryMethod模式,帶着MM到服務員那兒,說“要一個漢堡”,具體要什麼樣的漢堡呢,讓MM直接跟服務員說就行了。
工廠方法模式:核心工廠類不再負責所有產品的創建,而是將具體創建的工作交給子類去做,成爲一個抽象工廠角色,僅負責給出具體工廠類必須實現的接口,而不接觸哪一個產品類應當被實例化這種細節。