我正在开发一个Android应用程序,其中我有一个单例类,如下所示:
public class ClassName {
private static ClassName mobject;
public List<Question> mquestionslist;
public ClassName() {
mquestionslist=new ArrayList<Question>();
}
public static ClassName getInstance() {
if (mobject == null) {
mobject = new ClassName();
}
return mobject;
}
public void LoadQuestions()
{
//do somthing
}
}
现在每次我想使用这个对象,我只是从其他活动或片段调用ClassName.getInstance()。any_method_name()并直接使用它。 我从不为此类对象创建任何本地引用,如:
ClassName ref=ClassName.getInstance();
ref.any_method_name();
=&gt;请告诉我这个对象在垃圾收集器将其从内存中删除之前能够存活多长时间,这是一个很好的做法。 (无法从其他地方得到答案)
答案 0 :(得分:2)
通过调用&#39; getInstance&#39;获得的实例method是在类&Class;&#39;中定义的静态对象。
private static ClassName mobject;
在课程&#39; ClassName&#39;之前,该实例将无法进行垃圾回收。仍然装满。
如果用于加载&#39; ClassName&#39;的类加载器变为垃圾收集,那么类&#39; ClassName&#39;将被卸载并且相应的静态对象将丢失。
答案 1 :(得分:2)
根据您提出的问题类型,您对设计模式的了解似乎有限。所以让我给它添加一些描述。
Read this document to know about different design patterns.
这个特定的链接有每个设计模式的定义和解释,请阅读一次。下面我将提到少数人的使用。
<强>的Singleton:强>
如果您需要一个且只有一个类的实例,则应该使用它。是什么让你决定只需要一个实例?
下载多个文件的情况应该在一个线程中处理,因此下载管理器应该是单例,处理数据库的情况需要ACID实现,因此数据库处理程序应该是单例。也就是说,如果您不想序列化您的操作,则不应使用单例。
<强>工厂:强>
工厂方法通常用于Android中的Fragments。原因是什么?
假设你有一个viewpager,其中viewpager中的内容类型与常见的东西不同,所以你可以在你的超级片段中有一个共同的newInstance
方法,在这里你可以处理逻辑来决定传递给哪个片段viewpager
基于位置和条件,这将简化您的代码,因为您将显示逻辑与功能逻辑隔离。 Factory还允许您维护Fragment参数。
<强>生成器:强>
当你有一个可以在没有任何参数的情况下直接使用的类或通过修改单个参数。在这种情况下,您不能为参数的每个组合提供构造函数,尽管您可以使用setter和getter,但请考虑首次初始化单个变量的情况。这里我们使用Builder。例如Glide或Picasso。
<强>结论:强>
你必须熟悉这个目的,一旦你的目的很明确,你就可以相应地选择设计模式。如果你坚持使用一种设计模式而不知道它的模式,那么你最终会使你的应用程序变得复杂。 最重要的是,如果您遵循正确的设计模式,您的应用程序将自动生效,在大多数情况下您无需担心内存和处理。 < / p>
希望这可以帮助您决定选择哪种模式。如果您想了解更多信息,请与我们联系。我建议的一件事是提出你的确切要求 有问题,以便我或其他人可以为此目的建议最好的模式。