伪代码
提供的片段将被视为伪代码.如果有一个不同的解决方案是解决这个问题的标准方法,我愿意接受.
这与预期用量有关:
一些澄清:
Main.java
不能允许@Override
.Configuration.java
不能是一个Interface
默认值应该给不被覆盖的字段.Configuration.java
将从其目前的两个领域大幅增长.渲染构建器模式非常混乱.Configuration.java
public class Configuration
{
public static int getFoo () { return 1; }
public static int getBar () { return 2; }
}
Run Code Online (Sandbox Code Playgroud)
UserDefinedConfiguration.java
public class UserDefinedConfiguration extends Configuration
{
@Override
public static int getFoo () { return 3; }
}
Run Code Online (Sandbox Code Playgroud)
Main.java
public final class Main {
private final Configuration config;
// default configuration
public Main () {
this (Configuration.class);
}
// …
Run Code Online (Sandbox Code Playgroud) 在java中,当我们创建一个类单例时,它只为每个应用程序创建该类的一个实例,而不是创建单例类,如果我们创建该类静态的所有方法和变量,那么它也只会创建该静态成员的一个实例.那么单例类对类的所有静态成员有什么好处?
我理解singleton强制执行一次类.但是如果我不直接访问它,为什么要存在一个实例呢?为什么这种模式不仅仅是使用静态方法和数据的完全静态类?
我是.NET开发人员。我接受了几次采访,并且多次遇到一个问题:“ Singleton Design模式在现实中的用途是什么?”。但是我的问题是“为什么我们使用单例,静态关键字就足够了?” 因为单例设计模式的目的是防止创建双重实例。如果我将single_class标记为static,那么我是否也可以实现相同的目标。
环顾网络,我已经看到了这种简单的模式,该模式实现了(线程安全的)单例(在C#中)。
public sealed class MySingleton
{
private static readonly MySingleton _instance = new MySingleton();
private string[] _data = new string[10];
// Private constructor, so no outsiders have access.
private MySingleton()
{
// Initialize _data member here
}
// Static method to provide access to instance
public static MySingleton Instance
{
get { return _instance; }
}
public string GetStringCount
{
return _data.Length;
}
}
Run Code Online (Sandbox Code Playgroud)
我知道该_instance
成员需要声明为静态,因为它是从static Instance()
方法访问的。
但是是否应将其他成员声明为静态成员?根据定义,单例仅存在一次,因此成员也只能存在一次(对于单个实例),就像静态变量仅存在一次一样。
我应该声明_data
为静态吗?
可能重复:
静态类和单例模式之间的区别?
为什么一个人只需要一个实例?使用具有静态成员变量和静态方法的类可以实现相同的目的.
据我所知,可能有两种可能的答案 -
当你的类需要有状态而你只需要一个对象时.从设计的角度来看,具有静态方法和变量的类被认为是Utility类,不应该保持任何状态.
如果您的类需要参与多态,并且您只想要继承树中的类的一个对象.
如果某人可以提供现实生活场景中的示例或者Singleton对象需要参与多态/继承的任何Java API,那将会非常有用吗?
我知道静态方法对于接口来说是不正确的(请参阅:为什么 C# 不允许静态方法实现接口?)但遇到了这样的情况:我有一个对象实现了接口的所有方法,其中所有方法都可以静态的,所以我想我的设计一定是错误的。
问题是,我看不到任何替代方案
我的接口IDataSerializer
是由几个类实现的。一种对 XML 进行反序列化,一种对 JSON 进行序列化,等等。所有这些类都实现相同的功能,并且没有任何类具有任何“状态数据”(成员等),但最终都会输出相同类型的对象。
例如,XML 类:
public class MyXmlSerializer : IDataSerializer
{
public string SerializeFoo(object foo)
{
// uses .Net XML serialzer to serialize foo
}
public object DeserializeFoo(string foo)
{
// uses .NET XML serializer to deserialize foo
}
// Object type returned by above methods is only ever
// used by following method which returns a type available
// to all IDataSerializer implementations as this is
// the data …
Run Code Online (Sandbox Code Playgroud) 这真的让我很困惑。没有什么可以阻止我们创建具有实例字段和实例方法的类,而不是创建具有静态字段和静态方法的类。两者都可以注册为单例。
是否有解决此问题的首选方法,为什么?
编辑:我不是在询问使用单例模式创建一个类。我问的是单例依赖注入类与注入同一个类但具有静态定义的成员/字段/方法/属性。