在简单工厂模式中增加新的具体产品时是否符合“开闭原则”?如果不符合,原有系统需作 出哪些修改?
我的回答:不符合“开闭原则”,如果要新增一个具体产品类,就需要改变工厂类。在静态工厂方法中,用反射构造具体的产品类。
工厂方法模式中的工厂方法能否为静态方法?为什么?
我的回答:意思是具体工厂类实现的工厂方法为静态方法?
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
如果系统中存在两个以上的变化维度,是否可以使用桥接模式进行处理?如果可以,系 统该如何设计?
我的回答:可以吧,所谓抽象和实现沿着各自维度 的变化,也就是说抽象和实现不再在同一个继承层次结构中,而是“子类化”它们,使它们各自 都具有自己的子类,以便任何组合子类,从而获得多维度组合对象。
abstract class Abstraction {
//这边多设定几个维度,应该可以
protected Implementor impl; //定义实现类接口对象
public void setImpl(Implementor impl) {
this.impl=impl;
}
public abstract void operation(); //声明抽象业务方法
}