考虑使用 Singleton 模式 时拥有子类别的问题,在Singleton模式中的getInstance()通常是一个静态方法,不能在子类别中重新定义它,关于子类别实例的产生交由getInstance()来进行是最好的选择,例如:
public class Singleton {
private static Singleton instance = null;
private Singleton() {
// ....
}
public static Singleton getInstance() {
if (instance == null) {
// getEnv表示系统环境变数
String style = getEnv("style");
if (style.equals("child1"))
instance = new ChildSingleton1();
else if (style.equals("child2r"))
instance = new ChildSingleton2();
else
instance = new Singleton();
}
return _instance;
}
// ....
}
上面这个程式片段改写自 Gof 书中关于Singleton的例子,并用Java实现;在书中指出,这个例子的缺点是每增加一个子类别,getInstance()就必须重新修改,这个问题在Java中可以使用Reflection机制来解决:
public class Singleton {
private static Singleton instance = null;
private Singleton() {
// ....
}
public static Singleton getInstance() {
if (instance == null) {
// getEnv表示环境变数
String style = getEnv("style");
try {
instance = (Singleton)
Class.forName(style).newInstance();
}
catch(Exception e) {
System.out.println(
"Sorry! No such class defined!");
}
}
return instance;
}
// ....
}
上面的方式使用了Java的Reflection机制,并透过环境变数设定要产生的子类Singleton,如果不使用Reflection的话,Gof 书中提出的改进方法是使用Registry of Singleton方法:
import java.util.*;
public class Singleton {
// 注册表,用于注册子类别物件
private static Map registry = new HashMap();
private static Singleton instance;
public static void register(
String name, Singleton singleton) {
registry.put(name, singleton);
}
public static Singleton getInstance() {
if (instance == null) {
// getEnv表示取得环境变数
String style = getEnv("style");
instance = lookup(style);
}
return instance;
}
protected static Singleton lookup(String name) {
return (Singleton) registry.get(name);
}
}
在Gof书中使用List来实现注册表,而在这边使用HasMap类别来实现,它是由Java SE所提供的;在父类别中提供一个register() 以注册Singleton的子类别所产生之实例,而注册的时机可以放在子类别的建构方法中加以实现,例如:
public class ChildSingleton1 extends Singleton {
public ChildSingleton1() {
// ....
// 注册子类别物件
register(getClass().getName(), this);
}
}
若要利用Singleton,则先使用这个子类别产生物件,这会向父类别注册物件,之后透过Singleton父类别来取得物件:
// 必须先启始这段注册程序
// 产生并注册ChildSingleton1物件
new ChildSingleton1();
// 产生并注册ChildSingleton2物件
new ChildSingleton2();
// 注册完成,可以使用父类别来取得子类的Singleton
// 至于取回何哪一个,视您的环境变数设置决定
Singleton childSingleton = Singleton.getInstance();
这种方式的缺点是您必须在程式中启始一段程序,先向父类别注册子类的Singleton,之后才能透过父类别来取得指定的子类别Singleton实例,好处是可以适用于没有Reflection机制的语言,如果您想要改变Singleton父类传回的子类Singleton,可以在上面的 Singleton类别中加入一个reset()方法,将instance设定为null,然后重新设定环境变数,之后再利用 Singleton父类的getInstance()方法重新取得注册表中的其它子类。
事实上Registry of Singleton的真正优点正在于此,您可以使用父类别来统一管理多个继承的子类别之Singleton实例,您可以在需要的时候再向父类别注册子类 Singleton,必要时随时调整传回的子类别Singleton。
分享到:
相关推荐
4. **安全模式**:该软件具备安全模式,可以防止非授权或误操作导致的系统不稳定。在修改敏感区域前,它会提示用户确认操作,降低出错风险。 5. **导出与导入**:Registry Workshop支持导出注册表项为.reg文件,...
Provides the most advanced container registry, Quay Docker was made available as open source in March 2013 and has become the most commonly used containerization platform. Kubernetes was open-sourced ...
镜像仓库:registry.k8s.io 镜像列表如下: registry.k8s.io/sig-storage/nfsplugin:v4.6.0 registry.k8s.io/sig-storage/livenessprobe:v2.12.0 registry.k8s.io/sig-storage/csi-provisioner:v4.0.0 registry.k8s...
该存储库通过使用接口工厂来演示Golang中的注册表模式。 延迟的TOML加载演示了动态配置。 选择TOML是因为它通常用于工具配置,尽管任何允许延迟解码的配置(即json.RawMessage)都可以将配置级联到插件。 它还演示...
1. 镜像和仓库和 GitHub 一样,可以被收藏和被 “star” 2. 和 GitHub 一样,可以在仓库上面留评论以便和维护人员进行交流 3. 和 Git
- 在物联网设备的调试过程中,sscom32可以帮助开发者理解设备的通信模式,查找并修复可能出现的问题。 - 对于软件工程师来说,它可以作为快速测试通信接口的工具,无需编写复杂的测试程序。 **五、使用步骤** 1. ...
作为可重用 C++11 组件的Singleton和Multiton (又名Registry of Singletons )创建设计模式。 目录 (ToC) 介绍 Singleton是一种创建型设计模式,定义如下: “确保一个类只有一次实例,并为其提供一个全局访问点...
《Dubbo Registry Protocol详解》 在分布式服务框架中,注册中心是实现服务发现和服务治理的核心组件,而Dubbo作为一款高性能、轻量级的Java RPC框架,其注册协议(Dubbo Registry Protocol)扮演了至关重要的角色...
Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker 一通百度,发现原来是dns服务器的错误,把服务器改成8.8.8.8或者114.114.114.114即可 具体做法: vim /etc/...
package Foo::Registry; use Moose; with 'MooseX::Role::Registry'; sub config_file { return '/foo_objects.yml'; } sub build_registry_object { my $self = shift; my $name = shift; my $values = shift ...
Could not resolve dependencies for project org.apache.flink:flink-avro-confluent-registry:jar:1.15.3: Could not find artifact io.confluent:kafka-schema-registry-client:jar:6.2.2 in maven 安装本地...
解决docker报错dial tcp lookup registry-1.docker.io
Registry Workshop 是一款高级的注册表编辑工具,能够完全替代 WIndows 系统自带的 RegEdit 注册表编辑器。除了RegEdit的特性外,Registry Workshop 提供许多其他功能提高注册表编辑操作效率:能够剪切,复制和粘贴...
赠送jar包:micrometer-registry-prometheus-1.8.2.jar 赠送原API文档:micrometer-registry-prometheus-1.8.2-javadoc.jar 赠送源代码:micrometer-registry-prometheus-1.8.2-sources.jar 包含翻译后的API文档...
npm-registry-couchapp 弃用通知:随着npm的扩展,注册中心体系结构逐渐向复杂的分布式体系结构迁移,其中npm-registry-couchapp仅是一小部分。 FOSS是npm的重要组成部分,随着时间的推移,我们计划公开更多的API,...
registry.aliyuncs.com/google_containers/kube-apiserver:v1.17.0 registry.aliyuncs.com/google_containers/kube-controller-manager:v1.17.0 registry.aliyuncs.com/google_containers/kube-scheduler:v1.17.0 ...
registry.aliyuncs.com/google_containers/kube-apiserver:v1.23.0 registry.aliyuncs.com/google_containers/kube-controller-manager:v1.23.0 registry.aliyuncs.com/google_containers/kube-scheduler:v1.23.0 ...
当没有第三方docker 仓库,可以使用registry 生成一个本地的docker仓库 使用docker load < registry.tar 导入镜像