在簡單工廠模式中增加新的具體產品時是否符合“開閉原則”?如果不符合,原有系統需作 出哪些修改?
我的回答:不符合“開閉原則”,如果要新增一個具體產品類,就需要改變工廠類。在靜態工廠方法中,用反射構造具體的產品類。
工廠方法模式中的工廠方法能否爲靜態方法?爲什麼?
我的回答:意思是具體工廠類實現的工廠方法爲靜態方法?
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