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

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

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

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

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

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(); //声明抽象业务方法
}
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rgbhi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值