Java設計模式(劉偉)的思考題個人回答1

在簡單工廠模式中增加新的具體產品時是否符合“開閉原則”?如果不符合,原有系統需作 出哪些修改?

我的回答:不符合“開閉原則”,如果要新增一個具體產品類,就需要改變工廠類。在靜態工廠方法中,用反射構造具體的產品類。

工廠方法模式中的工廠方法能否爲靜態方法?爲什麼?

我的回答:意思是具體工廠類實現的工廠方法爲靜態方法?

class ConcreteFactory implements Factory { 
 	public Product factoryMethod() {
 		//相當於這段代碼寫死唄,當然,你願意這樣寫也行。如果之後要改,就要改這邊的代碼了。
 		 return new ConcreteProduct(); 
 	 } 
 }
有人說:可以在客戶端代碼中直接通過反射機制來生成產品對象,在定義產品對象時使用抽 象類型,同樣可以確保系統的靈活性和可擴展性,增加新的具體產品類無須修改源代碼,只 需要將其作爲抽象產品類的子類再修改配置文件即可,根本不需要抽象工廠類和具體工廠 類。

我的回答:既然可以用反射機制來形成具體的對象,爲什麼還要工廠類呢?、具體工廠類到生成具體對象中間可以處理一些東西。比如說,具體工廠類在實現工廠方法時除了創建具體產品對象之外,還可以負責產品 對象的初始化工作以及一些資源和環境配置工作,例如連接數據庫、創建文件等。

抽象工廠模式是否符合“開閉原則”?【從增加新的產品等級結構和增加新的產品族兩方面進行 思考。】

我的回答:從增加新的產品族來考慮的話,是符合“開閉原則”的。增加新的產品等級結構的話,不符合,需要去抽象工廠那邊新增一個產品等級結構了。

爲什麼要將成員變量tm定義爲靜態變量?
private TaskManager() {
	private static TaskManager tm = null;
	public static TaskManager getInstance() {
		if (tm == null) {
			tm = new TaskManager();
		}
		return tm;
	}
}

我的回答:private static 聲明變量靜態方法不能訪問非靜態成員變量。

如何對單例模式進行改造,使得系統中某個類的對象可以存在有限多個,例如兩例或三例? 【注:改造之後的類可稱之爲多例類。】
class Singleton {
	private static ArrayList<Singleton> SingletonList = new ArrayList<Singleton>();
	static int max_num=2;
	private String flagString=null;
	
	public Singleton(String flag){
		this.flagString=flag;
	}
	public static Singleton getInstance(){
		synchronized (Singleton.class) {
			if(SingletonList.size()<max_num){
				 SingletonList.add(new Singleton("before is "+SingletonList.size()));
			}
			Random random = new Random();
			int i = random.nextInt(SingletonList.size());
			return SingletonList.get(i);
		}
	}
	public static void main(String args[]) {
		Singleton s1, s2, s3,s4;
		s1 = Singleton.getInstance();
        s2 = Singleton.getInstance();
        s3 = Singleton.getInstance();
        s4 = Singleton.getInstance();
        System.out.println(s1==s2);
        System.out.println(s1.flagString);
        System.out.println(s2.flagString);
        System.out.println(s3.flagString);
        System.out.println(s4.flagString);
	}
}
能否將上述代碼中的clone()方法寫成:public Prototype clone() { return this; }?給出你的理由。
class ConcretePrototype implements Prototype{
	public Prototype clone() {
		Prototype prototype = new ConcretePrototype(); //創建新對象
		prototype.setAttr(this.attr);
		return prototype;
	}
}

我的回答:不行,這樣返回的還是原型對象,this指向當前類。

如果在Client類的main()函數中增加如下幾條語句:
System.out.println(log_previous == log_new); System.out.println(log_previous.getDate() == log_new.getDate()); System.out.println(log_previous.getName() == log_new.getName()); System.out.println(log_previous.getContent() == log_new.getContent());
預測這些語句的輸出結果。

我的回答:false,不是一個對象;false,時間的值不一樣;true,值一樣;true,值一樣;

****週報****
周次:第12周
姓名:張無忌
內容:這周工作很忙,每天加班!
--------------------------------
****週報****
周次:第13周
姓名:張無忌
內容:這周工作很忙,每天加班!
false
false
true
true
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章