當然也可以結合工廠模式來創建AbstractSpoon實例
在Java中Prototype模式變成clone()方法的使用
使得在Java中使用設計模式變得很自然
/**
創建模式
Builder模式定義:
將一個復雜對象的構建與它的表示分離
Builder模式是一步一步創建一個復雜的對象
用戶不知道內部的具體構建細節
細微的區別大概只有在反復使用中才能體會到
為何使用?
是為了將構建復雜對象的過程和它的部件解耦
因為一個復雜的對象
部件很多
Builder模式就是為了將部件和組裝過程分開
如何使用?
首先假設一個復雜對象是由多個部件組成的
分別用Builder類和Director類來表示
首先
public interface Builder {
//創建部件A 比如創建汽車車輪
void buildPartA();
//創建部件B 比如創建汽車方向盤
void buildPartB();
//創建部件C 比如創建汽車發動機
void buildPartC();
//返回最後組裝成品結果 (返回最後裝配好的汽車)
//成品的組裝過程不在這裡進行
//從而實現了解耦過程和部件
Product getResult();
}
用Director構建最後的復雜對象
(復雜對象是由這些部件組成的)
public class Director {
private Builder builder;
public Director( Builder builder ) {
this
}
// 將部件partA partB partC最後組成復雜對象
//這裡是將車輪 方向盤和發動機組裝成汽車的過程
public void construct() {
builder
builder
builder
}
}
Builder的具體實現ConcreteBuilder:
通過具體完成接口Builder來構建或裝配產品的部件;
定義並明確它所要創建的是什麼具體東西;
提供一個可以重新獲取產品的接口:
public class ConcreteBuilder implements Builder {
Part partA
public void buildPartA() {
//這裡是具體如何構建partA的代碼
};
public void buildPartB() {
//這裡是具體如何構建partB的代碼
};
public void buildPartC() {
//這裡是具體如何構建partB的代碼
};
public Product getResult() {
//返回最後組裝成品結果
};
}
復雜對象:產品Product:
public interface Product { }
復雜對象的部件:
public interface Part { }
我們看看如何調用Builder模式:
ConcreteBuilder builder = new ConcreteBuilder();
Director director = new Director( builder );
nstruct();
Product product = builder
Builder模式的應用
在Java實際使用中
並且這些資源需要被很多用戶反復共享時
如果循環再利用這些
修改Builder模式中Director類使之能診斷
/**
創建模式
定義:
Singleton模式主要作用是保證在Java應用程序中
在很多操作中
還有
另外方面
Singleton模式就為我們提供了這樣實現的可能
我們常常看到工廠模式中類裝入器(class loader)中也用Singleton模式實現的
如何使用?
一般Singleton模式通常有幾種形式:
public class Singleton {
private Singleton(){}
//在自己內部定義自己一個實例
//注意這是private 只供內部調用
private static Singleton instance = new Singleton();
//這裡提供了一個供外部訪問本class的靜態方法
public static Singleton getInstance() {
return instance;
}
}
第二種形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//這個方法比上面有所改進
//使用時生成實例
if (instance==null)
instance=new Singleton();
return instance; }
}
使用Singleton
上面第二中形式是lazy initialization
注意到lazy initialization形式中的synchronized
一般認為第一種形式要更加安全些
使用Singleton注意事項
有時在某些情況下
我們以SUN公司的寵物店源碼(Pet Store
在Pet Store中ServiceLocator有兩種
Singleton模式看起來簡單
/**
結構模式
Facade的定義: 為子系統中的一組接口提供一個一致的界面
Facade一個典型應用就是數據庫JDBC的應用
public class DBCompare {
Connection conn = null;
PreparedStatement prep = null;
ResultSet rset = null;
try {
Class
conn = DriverManager
String sql =
prep = conn
prep
rset = prep
if( rset
System
}
} catch( SException e ) {
e
} finally {
rset
prep
conn
}
}
上例是Jsp中最通常的對數據庫操作辦法
在應用中
我們做成了一個Facade接口
public class DBCompare {
String sql =
try {
Mysql msql=new mysql(sql);
prep
rset = prep
if( rset
System
}
} catch( SException e ) {
e
} finally {
mysql
mysql=null;
}
}
可見非常簡單
如果我們要使用連接池
facade實際上是個理順系統間關系
也許你已經不知不覺在使用
/**
結構模式
Proxy是比較有用途的一種模式
Proxy是代理的意思
代理概念可以解釋為:在出發點到目的地之間有一道中間層
設計模式中定義: 為其他對象提供一種代理以控制對這個對象的訪問
為什麼要使用Proxy?
如Jive論壇系統中
訪問論壇有兩種人:注冊用戶和游客(未注冊用戶)
Jive中就通過類似ForumProxy這樣的代理來控制這兩種用戶對論壇的訪問權限
舉例兩個具體情況:
(
那麼當這個圖片包含在文檔中時
不能等待大圖片處理完成
(
直接操作這個對象因為網絡速度原因可能比較慢
總之原則是
所以
如何使用Proxy?
以Jive論壇系統為例
注冊普通用戶才能發言;論壇管理者可以管理他被授權的論壇;系統管理者可以管理所有事務等
這些權限劃分和管理是使用Proxy完成的
Forum是Jive的核心接口
論壇描述的獲取和修改
在ForumPermissions中定義了各種級別權限的用戶:
public class ForumPermissions implements Cacheable {
/** Permission to read object
public static final int READ =
/** Permission to administer the entire sytem
public static final int SYSTEM_ADMIN =
/** Permission to administer a particular forum
public static final int FORUM_ADMIN =
/** Permission to administer a particular user
public static final int USER_ADMIN =
/** Permission to administer a particular group
public static final int GROUP_ADMIN =
/** Permission to moderate threads
public static final int MODERATE_THREADS =
/** Permission to create a new thread
public static final int CREATE_THREAD =
/** Permission to create a new message
public static final int CREATE_MESSAGE =
/** Permission to moderate messages
public static final int MODERATE_MESSAGES =
public boolean isSystemOrForumAdmin() {
return (values[FORUM_ADMIN] || values[SYSTEM_ADMIN]);
}
}
因此
作為接口Forum的實現:ForumProxy正是將這種對應關系聯系起來
比如
public class ForumProxy implements Forum {
private ForumPermissions permissions;
private Forum forum;
this
public ForumProxy(Forum forum
ForumPermissions permissions)
{
this
this
this
}
public void setName(String name) throws UnauthorizedException
ForumAlreadyExistsException
{
//只有是系統或論壇管理者才可以修改名稱
if (permissions
forum
}
else {
throw new UnauthorizedException();
}
}
}
而DbForum才是接口Forum的真正實現
public class DbForum implements Forum
public void setName(String name) throws ForumAlreadyExistsException {
this
//這裡真正將新名稱保存到數據庫中
saveToDb();
}
}
凡是涉及到對論壇名稱修改這一事件
由ForumProxy決定是否有權限做某一樣事情
在平時應用中
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27593.html