《AspectJ Cookbook》讀書筆記十七: 實現創建型面向對象設計模式
一.實現單件模式
單件模式允許把類定義成具有應用程序內的一個運行時實例。通常,通過不給特定類提供默認構造函數來實現單件。
package com.aspectj;

import java.util.Hashtable;

public abstract aspect SingletonPattern issingleton(){
private Hashtable singletons = new Hashtable();
public interface Singleton{}
public interface NonSingleton{}
//Pointcut to define specify an interest in all creations
//of all Classes that extend Singleton
pointcut selectSingletons() : call((Singleton+).new(..));
//Pointcut to ensure that any classes in the Singleton inheritance tree
//that are marked as Non Singletons are not included in the Singleton
//logic.
pointcut excludeNonSingletons():!call((NonSingleton+).new (..));
Object around() : selectSingletons()&&excludeNonSingletons() {
Class singleton = thisJoinPoint.getSignature().getDeclaringType();
synchronized(singletons) {
if (singletons.get(singleton) == null) {
singletons.put(singleton, proceed());
}
}
return (Object) singletons.get(singleton);
}
}
SingletonPattern抽象方面定義了兩個角色:Singleton和NonSingleton。這些角色被實現為接口,使得抽象方面可以處理單件,而無需關注實現細節。
Singleton接口由SingletonPattern抽象方面的子方面應用于目標應用程序內將被視作單件的任何類。類似地,NonSingleton接口被應用于可能通過繼承從其父類獲得單件行為的類。如果決定子類不是一個單件,那么就可以使用NonSingleton接口,使得重寫父類的單件特征。
聲明兩個切入點來捕獲何時實例化具有Singleton接口的類。selectSingletons()切入點定義用于選擇對擴展Singleton接口的類上構造函數的調用。為了支持單件子類的關閉單件行為的要求,聲明了excludeNonSingletons()切入點。當需要阻止超類的單件行為影響子類時,可以通過單定的方面重寫這個切入點。
around()通知用于捕獲對應用于Singleton接口的類上構造函數的調用。around()通知會重寫構造函數,以檢查尚未創建正在實例化的對象的類型。
使用thisJoinPoint變量提供的類的信息,在單件散列表上查詢正在創建的對象的類。如果類的類型在散列表中不存在,那么就添加它的類,并通過調用proceed()來構造那個類的一個對象,這會執行原始的構造函數邏輯。process()調用會返回構造的對象,并把這個對象與類對象一起添加到散列表中。
如果散列表中存在類的類型,那么就不需要創建新對象。依據它的類從散列表映射檢索單件對象,并作為構造函數調用的結果從around()通知返回這個對象。
以下為如何把SingletonPattern抽象方面應用于特定的應用程序中。
package com.aspectj;

public aspect PrinterSingleton extends SingletonPattern {
declare parents:Printer implements Singleton;
declare parents:SpecializedPrinter implements NonSingleton;
}
二.實現原型模式
原型模式支持基于原始對象創建復制的對象。
package com.aspectj;

public abstract aspect PrototypePattern {
protected interface Prototype{}
public Object Prototype.clone() throws CloneNotSupportedException {
return super.clone();
}
public Object cloneObject(Prototype object) {
try {
return object.clone();
} catch (CloneNotSupportedException ex) {
return createCloneFor(object);
}
}
protected Object createCloneFor(Prototype object) {
return null;
}
}
clone()方法是用于實現對象深復制的Java機制。有些基類可能不支持被復制;createCloneFor(Prototype)方法,可以被子方面重新,以執行通用方面不知道的特定復制操作。
package com.aspectj;

public aspect GraphicPrototypes extends PrototypePattern {
declare parents:MyClass implements Prototype;

declare parents:AnotherClass implements Prototype;

//declare parents:Staff implements Prototype;

protected Object createCloneFor(Prototype object) {
if (object instanceof MyClass) {
return null;
} else if (object instanceof AnotherClass) {
return null;
} else {
return null;
}
}
}
三.實現抽象工廠模式
抽象工廠模式支持對一組相關類進行實例化,同時把工廠模式的客戶與準確的實現隔離開。
package com.aspectj;

public interface ComputerFactory {
public Computer createPentiumProcessorComputer();
public Computer createPentiumProcessorComputerWithHardDisk(HardDisk hardDisk);
}
package com.aspectj;

public aspect DefaultComputerFactoryImplementation {
public Computer createPentiumProcessorComputer() {
Processor processor = new Processor("Pentium 4:9089085043");
Motherboard motherboard = new Motherboard("019283" , processor);
HardDisk hardDisk = new HardDisk("739874");
FloppyDisk floppyDisk = new FloppyDisk("93746");
Computer computer = new Computer("12345" , motherboard,hardDisk,floppyDisk);
return computer;
}
public Computer createPentiumProcessorComputerWithHardDisk(HardDisk hardDisk) {
Processor processor = new Processor("Pentium Standard:123478");
Motherboard motherboard = new Motherboard("434244" , processor);
FloppyDisk floppyDisk = new FloppyDisk("434234");
Computer computer = new Computer("56789" , motherboard,hardDisk,floppyDisk);
return computer;
}
}
四.實現工廠方法模式
package com.aspectj;

public aspect DefaultComputerCreatorImplementation {
public void ComputerCreator.createComputerAndPrintInventory(String serial) {
System.out.println("Inventory of computerparts:");
System.out.println(this.createComputer(serial).toString());
}
}
package com.aspectj;

public aspect DefaultComputerCreatorImplementation {
public void ComputerCreator.createComputerAndPrintInventory(String serial) {
System.out.println("Inventory of computerparts:");
System.out.println(this.createComputer(serial).toString());
}
}
五.實現生成器模式
生成器模式用于捕獲在創建對象時可能需要的復雜步驟。這些步驟被實現為生成器類上的方法;在完成每個必須的步驟之后,就可以調用生成器來創建所得到的生成對象。
package com.aspectj;

public interface TextPhraseBuilder {
public void buildHeader(String title);
public void buildContent(String content);
public void buildFooter(String closingContent);
public String getResult();
}
package com.aspectj;

public aspect TextPhraseBuilderDefaultImplementation {
public StringBuffer TextPhraseBuilder.result = new StringBuffer();
public String TextPhraseBuilder.getResult() {
return result.toString();
}
/**
* Declares a compiler error that gets reported if other classes
* (except Builders or this aspect) try to access the result variable.
*/
declare error:(
set(public StringBuffer TextPhraseBuilder +.result)
|| get(public StringBuffer TextPhraseBuilder +.result))
&& !(within(TextPhraseBuilder +)
|| within(TextPhraseBuilderDefaultImplementation)) :
"variable result is aspect protected. use getResult() to access it";
}
單件模式允許把類定義成具有應用程序內的一個運行時實例。通常,通過不給特定類提供默認構造函數來實現單件。































SingletonPattern抽象方面定義了兩個角色:Singleton和NonSingleton。這些角色被實現為接口,使得抽象方面可以處理單件,而無需關注實現細節。
Singleton接口由SingletonPattern抽象方面的子方面應用于目標應用程序內將被視作單件的任何類。類似地,NonSingleton接口被應用于可能通過繼承從其父類獲得單件行為的類。如果決定子類不是一個單件,那么就可以使用NonSingleton接口,使得重寫父類的單件特征。
聲明兩個切入點來捕獲何時實例化具有Singleton接口的類。selectSingletons()切入點定義用于選擇對擴展Singleton接口的類上構造函數的調用。為了支持單件子類的關閉單件行為的要求,聲明了excludeNonSingletons()切入點。當需要阻止超類的單件行為影響子類時,可以通過單定的方面重寫這個切入點。
around()通知用于捕獲對應用于Singleton接口的類上構造函數的調用。around()通知會重寫構造函數,以檢查尚未創建正在實例化的對象的類型。
使用thisJoinPoint變量提供的類的信息,在單件散列表上查詢正在創建的對象的類。如果類的類型在散列表中不存在,那么就添加它的類,并通過調用proceed()來構造那個類的一個對象,這會執行原始的構造函數邏輯。process()調用會返回構造的對象,并把這個對象與類對象一起添加到散列表中。
如果散列表中存在類的類型,那么就不需要創建新對象。依據它的類從散列表映射檢索單件對象,并作為構造函數調用的結果從around()通知返回這個對象。
以下為如何把SingletonPattern抽象方面應用于特定的應用程序中。






二.實現原型模式
原型模式支持基于原始對象創建復制的對象。






















clone()方法是用于實現對象深復制的Java機制。有些基類可能不支持被復制;createCloneFor(Prototype)方法,可以被子方面重新,以執行通用方面不知道的特定復制操作。




















三.實現抽象工廠模式
抽象工廠模式支持對一組相關類進行實例化,同時把工廠模式的客戶與準確的實現隔離開。































四.實現工廠方法模式

















五.實現生成器模式
生成器模式用于捕獲在創建對象時可能需要的復雜步驟。這些步驟被實現為生成器類上的方法;在完成每個必須的步驟之后,就可以調用生成器來創建所得到的生成對象。

































posted on 2008-08-27 11:00 Brian 閱讀(1131) 評論(0) 編輯 收藏 所屬分類: 《AspectJ Cookbook》讀書筆記