【发布时间】:2020-05-22 06:14:04
【问题描述】:
class HeavyweightObjcet
{
public void operate() {
System.out.println("Operating...");
}
}
class LazyInitializer
{
HeavyweightObjcet objcet;
public void operate()
{
if (objcet == null)
objcet = new HeavyweightObjcet();
objcet.operate();
}
}
在这里,我正在为重量级对象制作虚拟代理。每次调用HeavyweightObject::operate之前,程序首先检查对象是否为null。这部分在对象的整个生命周期中被检查一次且仅一次。
一个可能的改进可能是使用这样的状态模式:
class HeavyweightObjcet
{
public void operate() {
System.out.println("Operating...");
}
}
class LazyInitializer
{
HeavyweightObjcet objcet;
State state = new UninitializedState(this);
public void operate()
{
state.operate();
}
}
abstract class State
{
LazyInitializer initializer;
public State(LazyInitializer initializer)
{
this.initializer = initializer;
}
abstract void operate();
}
class UninitializedState extends State
{
public UninitializedState(LazyInitializer initializer) {
super(initializer);
}
@Override
public void operate() {
initializer.objcet = new HeavyweightObjcet();
initializer.state = new InitializedState(initializer);
initializer.operate();
}
}
class InitializedState extends State
{
public InitializedState(LazyInitializer initializer) {
super(initializer);
}
@Override
public void operate() {
initializer.objcet.operate();
}
}
这个解决方案有意义吗?
代码有什么可能的改进吗?
以前有没有类似的例子?
这是不必要的并发症还是值得还是取决于具体情况?
它是否使代码更快?我的意思是,额外的函数调用可能比简单的条件调用要慢。
【问题讨论】:
标签: java oop design-patterns lazy-initialization state-pattern