在PHP中使用单例而不是全局的数据库连接有什么好处?我觉得使用单例而不是全局会使代码变得不必要地复杂化.
$conn = new PDO(...);
function getSomething()
{
global $conn;
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
class DB_Instance
{
private static $db;
public static function getDBO()
{
if (!self::$db)
self::$db = new PDO(...);
return self::$db;
}
}
function getSomething()
{
$conn = DB_Instance::getDBO();
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
如果有一种更好的方法来初始化除全局或单例之外的数据库连接,请提及它并描述它相对于全局或单例的优势.
Ruby中的单例类本身就是一个类吗?这就是为什么所有对象都属于"类"的原因吗?这个概念很模糊,但我认为它与为什么我可以在所有(class foo; def foo.bar ...)中定义一个类方法有关.
Ruby中的单例类是什么?
我有习惯将记录器传递给构造函数,如:
public class OrderService : IOrderService {
public OrderService(ILogger logger) {
}
}
Run Code Online (Sandbox Code Playgroud)
但这很烦人,所以我已经使用了它一段时间了:
private ILogger logger = NullLogger.Instance;
public ILogger Logger
{
get { return logger; }
set { logger = value; }
}
Run Code Online (Sandbox Code Playgroud)
这也很烦人 - 它不干,我需要在每个班级重复这个.我可以使用基类,但是再次 - 我正在使用Form类,所以需要FormBase等等.所以我认为,暴露ILogger的单例会有什么不利因素,所以我们知道在哪里得到logger:
Infrastructure.Logger.Info("blabla");
Run Code Online (Sandbox Code Playgroud)
更新:正如Merlyn正确注意到的那样,我应该提一下,在第一和第二个例子中,我正在使用DI.
为什么Borg模式比Singleton模式更好?
我问,因为我没有看到它们导致任何不同.
博格:
class Borg:
__shared_state = {}
# init internal state variables here
__register = {}
def __init__(self):
self.__dict__ = self.__shared_state
if not self.__register:
self._init_default_register()
Run Code Online (Sandbox Code Playgroud)
辛格尔顿:
class Singleton:
def __init__(self):
# init internal state variables here
self.__register = {}
self._init_default_register()
# singleton mechanics external to class, for example this in the module
Singleton = Singleton()
Run Code Online (Sandbox Code Playgroud)
我想在这里显示的是服务对象,无论是作为Borg还是Singleton实现,都有一个非常重要的内部状态(它提供了一些基于它的服务)(我的意思是它必须是有用的东西,它不是Singleton/Borg只是为了有趣).
而且这个州必须被引入.这里的Singleton实现更直接,因为我们将init视为全局状态的设置.我发现Borg对象必须查询其内部状态以查看它是否应该自行更新.
你拥有的内部状态越多,情况就越糟糕.例如,如果对象必须侦听应用程序的拆除信号以将其寄存器保存到磁盘,那么该注册也应该只执行一次,使用Singleton会更容易.
我对这里记录的单例模式有一些疑问:http: //msdn.microsoft.com/en-us/library/ff650316.aspx
以下代码是文章的摘录:
using System;
public sealed class Singleton
{
private static volatile Singleton instance;
private static object syncRoot = new object();
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
}
Run Code Online (Sandbox Code Playgroud)
具体来说,在上面的例子中,是否需要在锁之前和之后将实例与null进行两次比较?这有必要吗?为什么不先执行锁定并进行比较?
简化以下是否有问题?
public static Singleton Instance
{
get
{
lock (syncRoot)
{
if (instance == null)
instance = new Singleton();
}
return instance; …Run Code Online (Sandbox Code Playgroud) 我想在我的应用程序的配置表中存储一行.我想强制说这个表只能包含一行.
实施单行约束的最简单方法是什么?
在C#中,我使用LINQ和IEnumerable一点点.一切都很好(或至少大部分都是如此).
但是,在很多情况下,我发现自己需要一个空IEnumerable<X>的默认值.也就是说,我想
for (var x in xs) { ... }
Run Code Online (Sandbox Code Playgroud)
无需空检查即可工作.现在这是我目前所做的,取决于更大的背景:
var xs = f() ?? new X[0]; // when xs is assigned, sometimes
for (var x in xs ?? new X[0]) { ... } // inline, sometimes
Run Code Online (Sandbox Code Playgroud)
现在,虽然上面对我来说完全没问题 - 也就是说,如果创建数组对象有任何"额外开销"我只是不在乎 - 我想知道:
在C#/ .NET中是否存在"空的不可变IEnumerable/IList"单例?(而且,即使没有,是否有一种"更好"的方式来处理上述情况?)
Java具有Collections.EMPTY_LIST不可变的单例 - "良好类型"的通道Collections.emptyList<T>()- 用于此目的,虽然我不确定类似的概念是否甚至可以在C#中工作,因为泛型的处理方式不同.
谢谢.
我是Android上的新手,我正在开发一个简单的应用程序来获得一些基本的体验.我的应用程序非常简单,包括广播接收器和一些活动.这两个组件都使用单个数据库,因此从理论上讲,两者都可能同时尝试访问数据库.
目前我只是在每次需要时实例化db对象(它是一个SQLite数据库帮助程序类),并执行所需的操作:查询,插入等.
从我在这里和其他一些文档中读到的,这有一个问题是在同时访问db的情况下获得"db locked"异常,所以更好的方法是拥有这个db对象的单个实例所以所有组件始终使用相同的数据库连接.
以上推理是否正确?那么一个单身人士会成为一个足够好的解决方案吗?我知道一些纯粹主义者可能反对它,但请注意,这是一个相当简单的应用程序,所以我可以负担得起在其他情况下我不会做的事情.
否则,更好的选择是什么?我已经阅读过有关使用内容提供商的内容,但这对此来说太过分了,除此之外我对与其他活动共享数据不感兴趣.我确实读过这篇文章,发现它很有帮助.
既然C++ 11有多线程,我想知道在不使用互斥锁的情况下实现延迟初始化单例的正确方法是什么(出于性能原因).我想出了这个,但是我并不擅长编写无锁代码,所以我正在寻找更好的解决方案.
// ConsoleApplication1.cpp : Defines the entry point for the console application.
//
# include <atomic>
# include <thread>
# include <string>
# include <iostream>
using namespace std;
class Singleton
{
public:
Singleton()
{
}
static bool isInitialized()
{
return (flag==2);
}
static bool initizalize(const string& name_)
{
if (flag==2)
return false;// already initialized
if (flag==1)
return false;//somebody else is initializing
if (flag==0)
{
int exp=0;
int desr=1;
//bool atomic_compare_exchange_strong(std::atomic<T>* obj, T* exp, T desr)
bool willInitialize=std::atomic_compare_exchange_strong(&flag, &exp, desr); …Run Code Online (Sandbox Code Playgroud) 我已经按照这个链接成功地在Android中制作了单例类. http://www.devahead.com/blog/2011/06/extending-the-android-application-class-and-dealing-with-singleton/
问题是我想要一个对象.就像我有活动A和活动B.在活动AI中从Singleton访问对象class.我使用该对象并对其进行了一些更改.
当我移动到Activity B并从Singleton Class访问该对象时,它给了我初始化的对象,并且不保留我在Activity A中所做的更改.还有其他方法可以保存更改吗?请高手帮帮我.这是MainActivity
public class MainActivity extends Activity {
protected MyApplication app;
private OnClickListener btn2=new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent=new Intent(MainActivity.this,NextActivity.class);
startActivity(intent);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Get the application instance
app = (MyApplication)getApplication();
// Call a custom application method
app.customAppMethod();
// Call a custom method in MySingleton
Singleton.getInstance().customSingletonMethod();
Singleton.getInstance();
// Read the value of a variable in MySingleton
String singletonVar = Singleton.customVar; …Run Code Online (Sandbox Code Playgroud)