我一直试图为我的设计模式课程实现一个状态管理项目。我已经实现了单例,因为我知道这对于保持类的状态至关重要。我想做的是:创建一个通用类,以便其他人可以在他们的项目中使用它。我该怎么做?我的代码到目前为止:
cl StateManager{
static final StateManager _instance = StateManager._singleton();
StateManager._singleton();
factory StateManager(){
return _instance;
}
}
我的其他解决方案,试图使它一般:
cl AppProvider extends StateManager<AppProvider>{
int i = 10;
String data = "adas";
}
cl StateManager<T extends AppProvider>{
static final StateManager _instance = StateManager._singleton();
StateManager._singleton();
factory StateManager(){
return _instance;
}
}
我希望 AppProvider 类是客户端类,我希望 StateManager 自动处理 AppProvider 应该是单例的事实,并保持 AppProvider 的状态。我真的不知道该怎么做。
通过单独的继承强制类成为单例是行不通的。这不是语言支持的东西。构造函数不被继承,也不是静态成员,你需要那些访问单例。
为了能够完全创建类的实例,该类需要一个生成构造函数。该生成构造函数将在每次调用时创建一个新实例,因为这就是生成构造函数所做的。对于能够扩展类的子类,超类也必须具有可访问的生成构造函数,但至少可以将超类设置为abstract
。
为了强制一个类是一个单例(如果你真的想要的,因为一个单例是一个反模式的东西;它使类的行为就像它只是一堆全局变量,这使得测试更加困难),每个这样的类需要有一个公共静态的方式来访问或创建实例,以及一个私人生成构造函数。
所以,基本上,你的第一个方法做什么是需要的,因为构造函数不继承,你需要为每个单例类这样做,没有什么有用的继承。
一种不同的方法是使状态类完全私有,因此您不必担心其他人创建实例,并为每个实例提供一个常量生成构造函数,然后仅使用引用它们const _ThisState()
或const _ThatState()
。这将使用户(您!)只创建每个状态对象的一个实例,但它也提供了一个非常时间容易
或使用枚举模式,并有:
abstract cl State {
static const State thisState = const _ThisState();
static const State thatState = const _ThatState();
const State._();
void handle(Context context, Object argument);
}
cl _ThisState implements State {
const _ThisState();
void handle(Context context, Object argument) { ... }
}
cl _ThatState implements State {
const _ThatState();
void handle(Context context, Object argument) { ... }
}
,然后将状态实例引用为State.thisState
。我发现比创建看似不相关的类的实例更具可读性。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(17条)