Java设计模式(刘伟)的思考题个人回答

    技术2025-04-11  15

    在简单工厂模式中增加新的具体产品时是否符合“开闭原则”?如果不符合,原有系统需作 出哪些修改?

    我的回答:不符合“开闭原则”,如果要新增一个具体产品类,就需要改变工厂类。在静态工厂方法中,用反射构造具体的产品类。

    工厂方法模式中的工厂方法能否为静态方法?为什么?

    我的回答:意思是具体工厂类实现的工厂方法为静态方法?

    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(); //声明抽象业务方法 }
    Processed: 0.012, SQL: 9