javascript

java

python

c#

android

node.js

reactjs

c++

php

html

jquery

css

.net

ios

git

ruby-on-rails

sql

c

string

ruby

设计模式-Singletons真的那么糟糕吗?

可能重复:
Singletons有什么不好?

可以理解,在某些情况下会滥用许多设计模式,就像妈妈总是说:“一件好事并不总是一件好事!”

我注意到这些天,我经常使用Singletons,我担心自己会滥用设计模式,并且越来越多地养成不良习惯。

我们正在开发一个Flex应用程序,该应用程序具有很大的层次结构数据结构,当用户对其进行操作时会保留在内存中。 用户可以按需加载,保存,更改和刷新数据。

该数据通过Singleton类进行集中,该类聚集了一些ArrayCollections,Arrays,value对象以及一些通过getter和setter公开的其他本机成员变量。

为了从应用程序中的任何地方获取对我们数据的引用,我们对整个Model.getInstance()方法进行了处理,我确定每个人都熟悉。 这确保了我们始终能够获得相同的数据副本,因为在设计时,我们曾说过在应用程序生存期内仅允许存在一个实例。

通过该中央数据存储库,例如,我们可以轻松地调度属性更改的事件,并且可以具有多个引用中央数据的UI组件,更新它们的显示以反映发生的数据更改。

到目前为止,这种方法是有效的,并且已证明对我们的情况非常实用。

但是,我发现在创建新类时我有点过于渴望。 诸如某个类应该是Singleton还是应该以其他方式进行管理(例如使用工厂)之类的问题有时会变得有些困难,并带有一些不确定性。

我在哪里画单身人士? 是否有确定何时使用Singleton以及何时远离它们的良好指南。

另外,有人可以推荐一本关于设计模式的好书吗?

trans by 2020-01-14T14:33:03Z

C ++单例与全局静态obj

我的一个朋友今天问我,为什么他应该更喜欢使用单例而不是全局静态对象?我开始解释的方式是,单例无法拥有状态对静态全局对象……但是后来我不确定..因为这是C ++语言。(我来自C#)

一个相对于另一个的优点是什么? (在C ++中)

trans by 2020-01-08T18:30:49Z

Javascript-使用RequireJS,如何传递全局对象或单例?

假设我在主页级别编写代码,并且2个依赖项需要一个对象的相同实例,并将其声明为依赖项。 解决这个问题的合适方法是什么?

基本上,我要说的是:“如果未加载此依赖项,则加载它。否则,请使用已经加载的相同实例,然后传递该实例。”

trans by 2020-01-06T00:24:27Z

Java-Android:由于连接池已关闭,无法执行此操作

我正在阅读关于这个问题的stackoverflow,但仍然没有找到解决方案。 我注意到有时,我的应用会引发此错误:

   java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.
        at android.database.sqlite.SQLiteConnectionPool.throwIfClosedLocked(SQLiteConnectionPool.java:962)
        at android.database.sqlite.SQLiteConnectionPool.waitForConnection(SQLiteConnectionPool.java:599)
        at android.database.sqlite.SQLiteConnectionPool.acquireConnection(SQLiteConnectionPool.java:348)
        at android.database.sqlite.SQLiteSession.acquireConnection(SQLiteSession.java:894)
        ...

我有一个名为DatabaseHelper.java的文件,使用这种方法来获取它的实例:

public static DatabaseHelper getInstance(Context context) {
    if (mInstance == null) {
        mInstance = new DatabaseHelper(context.getApplicationContext());
    }
    return mInstance;
}

然后,我有类似这样的方法(它在该行的cursor.moveToFirst()中崩溃,并显示该错误)。 它几乎从不崩溃,但有时会崩溃。

public Profile getProfile(long id) {
    SQLiteDatabase db = this.getReadableDatabase();

    String selectQuery = "SELECT * FROM " + TABLE_PROFILES + " WHERE " + KEY_PROFILES_ID + " = " + id;
    Cursor cursor = db.rawQuery(selectQuery, null);

    // looping through all rows and adding to list
    Profile profile = new Profile();
    if (cursor.moveToFirst()) {
        doWhatEver();
    }
    cursor.close();
    db.close();

    return profile;
}

就这样,在我使用的所有方法中:

SQLiteDatabase db = this.getReadableDatabase(); (or Writable)

然后关闭游标和数据库。 在这种情况下,该错误被抛出该行:

cursor.moveToFirst();

我不明白为什么如果我之前调用this.getReadableDatabase()时错误提示数据库已关闭。 请支持! 谢谢 :)

trans by 2019-12-30T21:15:12Z

java-线程安全单例类

我写了下面的Singleton类。 我不确定这是否是线程安全的单例类吗?

public class CassandraAstyanaxConnection {

    private static CassandraAstyanaxConnection _instance;
    private AstyanaxContext<Keyspace> context;
    private Keyspace keyspace;
    private ColumnFamily<String, String> emp_cf;



    public static synchronized CassandraAstyanaxConnection getInstance() {
        if (_instance == null) {
            _instance = new CassandraAstyanaxConnection();
        }
        return _instance;
    }

    /**
     * Creating Cassandra connection using Astyanax client
     *
     */
    private CassandraAstyanaxConnection() {

        context = new AstyanaxContext.Builder()
        .forCluster(ModelConstants.CLUSTER)
        .forKeyspace(ModelConstants.KEYSPACE)
        .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()      
            .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE)
        )
        .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool")
            .setPort(9160)
            .setMaxConnsPerHost(1)
            .setSeeds("127.0.0.1:9160")
        )
        .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()      
            .setCqlVersion("3.0.0")
            .setTargetCassandraVersion("1.2"))
        .withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
        .buildKeyspace(ThriftFamilyFactory.getInstance());

        context.start();
        keyspace = context.getEntity();

        emp_cf = ColumnFamily.newColumnFamily(
            ModelConstants.COLUMN_FAMILY, 
            StringSerializer.get(), 
            StringSerializer.get());
    }

    /**
     * returns the keyspace
     * 
     * @return
     */
    public Keyspace getKeyspace() {
        return keyspace;
    }

    public ColumnFamily<String, String> getEmp_cf() {
        return emp_cf;
    }
}

谁能帮我这个? 我在上述Singleton课堂上的任何想法都会有很大帮助。

更新代码:

我正在尝试将波希米亚建议纳入我的代码中。 这是更新的代码,我得到了-

public class CassandraAstyanaxConnection {
    private static class ConnectionHolder {
        static final CassandraAstyanaxConnection connection = new CassandraAstyanaxConnection();
    }
    public static CassandraAstyanaxConnection getInstance() {
        return ConnectionHolder.connection;
    }
    /**
     * Creating Cassandra connection using Astyanax client
     *
     */
    private CassandraAstyanaxConnection() {
        context = new AstyanaxContext.Builder()
        .forCluster(ModelConstants.CLUSTER)
        .forKeyspace(ModelConstants.KEYSPACE)
        .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()      
        .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE)
                )
                .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool")
                .setPort(9160)
                .setMaxConnsPerHost(1)
                .setSeeds("127.0.0.1:9160")
                        )
                        .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()      
                        .setCqlVersion("3.0.0")
                        .setTargetCassandraVersion("1.2"))
                        .withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
                        .buildKeyspace(ThriftFamilyFactory.getInstance());
        context.start();
        keyspace = context.getEntity();
        emp_cf = ColumnFamily.newColumnFamily(
                ModelConstants.COLUMN_FAMILY, 
                StringSerializer.get(), 
                StringSerializer.get());
    }
    /**
     * returns the keyspace
     * 
     * @return
     */
    public Keyspace getKeyspace() {
        return keyspace;
    }
    public ColumnFamily<String, String> getEmp_cf() {
        return emp_cf;
    }
}

谁能看一下,让我知道这一次我做对了吗?

谢谢您的帮助。

trans by 2019-10-27T08:58:54Z

php-Codeigniter中的get_instance():为什么将其分配给变量?

在Codeigniter中,&是全局可用的函数,它返回包含所有当前加载类的Controller超级对象(它返回Controller类实例)。 我将包括当前的源代码:

&function &get_instance(){}中定义

// Load the base controller class
require BASEPATH.'core/Controller.php';

function &get_instance()
{
    return CI_Controller::get_instance();
}

function &get_instance(){}中定义了&

class CI_Controller {

    private static $instance;

    /**
     * Constructor
     */
    public function __construct()
    {
        self::$instance =& $this;

        // Assign all the class objects that were instantiated by the
        // bootstrap file (CodeIgniter.php) to local class variables
        // so that CI can run as one big super object.
        foreach (is_loaded() as $var => $class)
        {
            $this->$var =& load_class($class);
        }

        $this->load =& load_class('Loader', 'core');

        $this->load->set_base_classes()->ci_autoloader();

        log_message('debug', "Controller Class Initialized");
    }

    public static function &get_instance()
    {
        return self::$instance;
    }
}

建议在用户指南中建议使用以下方式来创建库:

在您的库中利用CodeIgniter资源

要访问您库中的CodeIgniter本机资源,请使用   &功能。 此函数返回CodeIgniter超级   宾语。

通常,在控制器功能内,您将调用   使用&构造的可用CodeIgniter函数:   function &get_instance(){}

&,但是,只能直接在您的控制器,   模型或您的意见。 如果您想使用CodeIgniter的类   您可以在自己的自定义类中执行以下操作:

首先,将CodeIgniter对象分配给变量:

$ CI =&get_instance();

将对象分配给变量后,即可使用   变量而不是&:       $ CI =&get_instance();       $ CI-> load-> helper('url'); $ CI-> load-> library('session');       $ CI-> config-> item('base_url'); 等等

注意:您会注意到上面的&函数正在   通过引用传递:

$ CI =&get_instance();

这个非常重要。 通过引用分配可让您使用   原始CodeIgniter对象,而不是创建它的副本。

相关文章:解释$ CI =&get_instance(); / Codeigniter:获取实例

所以,这是我的实际问题:

为什么用户指南建议将&分配给变量? 我相当确定我了解不通过引用分配的含义,但是为什么建议在function &get_instance(){}工作正常时将其分配给变量?

我在CI中看到许多用户定义的或第三方类,它们分配给对象的属性:

class MY_Class {

    private $CI;

    function __construct()
    {
        $this->CI =& get_instance();
    }
    function my_func()
    {
        $this->CI->load->view('some_view');
    }
    function my_other_func()
    {
        $this->CI->load->model('some_model');
    }
}

可怜的例子,但我经常看到这一点。 为什么不使用直接调用&的方法麻烦呢? 将整个Controller对象分配给一个类变量似乎不是一个好主意,即使它是引用。 也许没关系。

我想为&写一个包装函数,这样输入起来就更容易了,而且我不必经常将其分配给变量。

function CI()
{
    return get_instance();
}

要么:

function CI()
{
    $CI =& get_instance();
    return $CI;
}

然后,我可以在任何地方使用&,而无需将其分配给变量的麻烦,编写和理解它的作用非常容易,并且可以导致代码更短,更优雅。

  • 有什么理由不采用这种方法吗?
  • 上面的两个&函数之间有什么区别?
  • 为什么建议为变量分配&,而不是直接调用它?
  • function &get_instance(){}中的&是什么定义位置? 我对引用的用途有所了解,并在适当的时候使用了它们,但是我从未见过以这种方式定义函数。 如果我确实编写了包装函数,是否还应该使用它?

请注意,这不是样式问题,而是技术问题。 我想知道使用我建议的方法是否存在任何问题,性能或其他问题。

编辑:到目前为止,我们有:

  • 方法链接在php4中不可用,因此为变量分配是一种解决方法(尽管这与Codeigniter放弃了对php4的支持完全无关)
  • 多次调用函数以返回对象而不是调用一次并分配给变量的次要开销。

还有什么,还是这些唯一的潜在问题?

trans by 2019-10-11T23:55:05Z

Android中的Singleton

我已遵循此链接,并成功在Android中制作了singleton类。[http://www.devahead.com/blog/2011/06/extending-the-android-application-class-and-dealing-with-singleton/]

问题是我想要一个对象。 像我有活动A和活动B。在活动A中,我从Singleton Singleton访问该对象。我使用该对象并对它进行了一些更改。

当我移至活动B并从Singleton类访问该对象时,它给了我初始化的对象,并且不保留我在活动A中所做的更改。还有其他方法可以保存更改吗?请高手帮帮我。这是Singleton

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;

    Log.d("Test",singletonVar);
    singletonVar="World";
    Log.d("Test",singletonVar);

    Button btn=(Button)findViewById(R.id.button1);
    btn.setOnClickListener(btn2);
}

}

这是Singleton

public class NextActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_next);

        String singletonVar = Singleton.customVar;

        Log.d("Test",singletonVar);
        }}

Singleton

public class Singleton
{
private static Singleton instance;

public static String customVar="Hello";

public static void initInstance()
{
if (instance == null)
{
  // Create the instance
  instance = new Singleton();
}
}

public static Singleton getInstance()
{
 // Return the instance
 return instance;
 }

 private Singleton()
 {
 // Constructor hidden because this is a singleton
 }

 public void customSingletonMethod()
 {
 // Custom method
 }
 }

Singleton

public class MyApplication extends Application
{
@Override
public void onCreate()
{
super.onCreate();

 // Initialize the singletons so their instances
 // are bound to the application process.
 initSingletons();
 }

 protected void initSingletons()
 {
 // Initialize the instance of MySingleton
 Singleton.initInstance();
 }

 public void customAppMethod()
 {
 // Custom application method
}
}

当我运行此代码时,我得到的Hello已在Singleton中初始化,然后我在MainActivity中给了它的World并再次在logcat中的NextActivity中显示了Hello。我希望它在NextActivity中再次显示世界。请帮助我纠正此问题。

trans by 2019-10-01T12:24:40Z

C ++中高效的线程安全单例

单例课程的通常模式如下

static Foo &getInst()
{
  static Foo *inst = NULL;
  if(inst == NULL)
    inst = new Foo(...);
  return *inst;    
}

但是,据我了解,此解决方案不是线程安全的,因为1)Foo的构造函数可能被多次调用(可能无关紧要),并且2)inst在返回到另一个线程之前可能未完全构建。

一种解决方案是在整个方法周围包裹一个互斥体,但是在我真正需要同步开销后很长一段时间,我就要为此付出代价。 另一种方法是

static Foo &getInst()
{
  static Foo *inst = NULL;
  if(inst == NULL)
  {
    pthread_mutex_lock(&mutex);
    if(inst == NULL)
      inst = new Foo(...);
    pthread_mutex_unlock(&mutex);
  }
  return *inst;    
}

这是正确的方法,还是我应该注意的陷阱? 例如,是否有可能发生任何静态初始化顺序问题,即inst总是在首次调用getInst时始终保证为NULL?

trans by 2019-09-30T00:29:49Z

数据库设计-SQL Server:如何限制表包含单个行?

我想在应用程序的配置表中存储一行。 我要强制该表只能包含一行。

强制单行约束的最简单方法是什么?

trans by 2019-09-28T16:42:43Z

为什么Borg模式比Python中的Singleton模式更好

为什么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()

辛格尔顿:

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()

我想在这里显示的是,服务对象,无论是实现为Borg还是Singleton,都具有不平凡的内部状态(它基于该状态提供一些服务)(我的意思是它必须是有用的东西,而不仅仅是Singleton / Borg有趣)。

而这种状态必须被初始化。 这里的Singleton实现更为简单,因为我们将init视为全局状态的设置。 我发现Borg对象必须查询其内部状态以查看是否应该更新自身很尴尬。

内部状态越多,情况就越糟。 例如,如果对象必须侦听应用程序的拆除信号以将其寄存器保存到磁盘,则该注册也应该只执行一次,而使用Singleton则更容易。

trans by 2019-09-26T03:05:09Z

java-对SQLiteDatabas使用Singleton设计模式

我是Android上的新手,并且我正在开发一个简单的应用程序以获取一些基本经验。 我的应用程序非常简单,包括广播接收器和一些活动。 这两个组件都使用单个数据库,因此从理论上讲,这两个组件都可能尝试同时访问数据库。

目前,我只是在每次需要时实例化db对象(这是一个SQLite db helper类),并执行所需的操作:查询,插入等。

从我在这里和其他一些文档中已阅读的内容来看,如果要同时访问db,则会出现“ db lock”异常的问题,因此更好的方法是使用该db对象的单个实例,以便所有 组件始终使用相同的数据库连接。

以上推理正确吗? 那么单身人士将是一个足够好的解决方案吗? 我知道有些纯粹主义者可能会反对它,但是请注意,这是一个相当简单的应用程序,因此我可以负担其他情况下无法做到的事情。

否则,更好的选择是什么? 我已经读过有关使用内容提供程序的信息,但是这样做除了我不想与其他活动共享数据外,对它来说已经太多了。 我确实已经阅读了这篇文章,并发现它很有帮助。

trans by 2019-09-25T17:06:39Z

PHP的-全球或单身人士的数据库连接?

在PHP中使用单例而不是全局的数据库连接有什么好处? 我觉得使用单例而不是全局会使代码变得不必要地复杂。

全局编码

$conn = new PDO(...);

function getSomething()
{
    global $conn;
    .
    .
    .
}

用Singleton编码

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();
    .
    .
    .
}

如果除了全局或单例之外,还有一种更好的初始化数据库连接的方法,请提及它并描述它比全局或单例具有的优势。

trans by 2019-09-20T22:14:21Z

c# - 在.NET中进行双重检查锁定时需要volatile修饰符

多个文本说,当在.NET中实现双重检查锁定时,您锁定的字段应该应用volatile修饰符。 但为什么呢? 考虑以下示例:

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;
      }
   }
}

为什么不“锁定(syncRoot)”完成必要的内存一致性? 在“lock”语句之后,读取和写入都是不稳定的,因此必须实现必要的一致性,这不是真的吗?

trans by 2019-09-20T04:43:12Z

在Java中使用Enum作为单例的最佳方法是什么?

基于SO问题编写的最佳单例实现在Java中 - 即使用枚举创建单例 - 有什么区别/优点/缺点(构造函数省略)

public enum Elvis {
    INSTANCE;
    private int age;

    public int getAge() {
        return age;
    }
}

然后拨打Elvis.getAge()

public enum Elvis {
    INSTANCE;
    private int age;

    public static int getAge() {
        return INSTANCE.age;
    }
}

然后拨打Elvis.getAge()

trans by 2019-09-11T22:50:20Z

GOF Singleton模式有没有可行的替代方案?

让我们面对现实吧。 Singleton模式是一个备受争议的话题,两侧都有成群的程序员。 有些人认为,辛格尔顿只不过是一个美化的全球变量,而其他人则以模式发誓并不断使用它。 但是,我不希望单身人士的争议成为我问题的核心。 每个人都可以进行一场拔河比赛并与之抗争,看看谁能为我所关心的所有人赢得胜利。 我想说的是,我不相信有一个正确的答案,而且我并没有故意尝试激烈的党派争吵。 当我问这个问题时,我只对单身替代品感兴趣:

他们是GOF Singleton模式的任何特定替代品吗?

例如,很多次我在过去使用单例模式时,我只想保留一个或多个变量的状态/值。 但是,变量的状态/值可以使用静态变量而不是使用单例模式在类的每个实例化之间保留。

您有什么其他想法?

编辑:我真的不希望这是关于&#34;如何正确使用单身人士的另一篇文章。&#34; 再一次,我正在寻找避免它的方法。 为了好玩,好吗? 我想我在你最好的电影预告片中问一个纯粹的学术问题,&#34;在一个没有单身的平行宇宙中,我们能做什么?&#34;

trans by 2019-08-28T11:33:48Z

Angular中的非单身人士服务

AngularJS在其文档中明确指出服务是单身人士:

AngularJS services are singletons

与直觉相反,ExampleService也返回一个Singleton实例。

鉴于非单例服务有很多用例,实现工厂方法返回服务实例的最佳方法是什么,这样每次声明一个ExampleService依赖项时,它都会被另一个实例满足。ExampleService

trans by 2019-08-24T00:09:44Z

python - 有一种简单,优雅的方式来定义单身人士吗?

这个问题在这里已有答案:

  • 在Python中创建单例                                     20个答案

似乎有很多方法可以在Python中定义单例。 Stack Overflow是否有共识?

trans by 2019-08-22T01:07:31Z

Javascript:最好的Singleton模式

可能重复:
在JavaScript中实现单例的最简单/最简洁的方法?

我将此模式用于单身人士,在示例中,单身人士是PlanetEarth:

var NAMESPACE = function () {

    var privateFunction1 = function () {
        privateFunction2();
    };

    var privateFunction2 = function () {
        alert('I\'m private!');
    };

    var Constructors = {};

    Constructors.PlanetEarth = function () {
        privateFunction1();
        privateFunction2();
    };

    Constructors.PlanetEarth.prototype = {
        someMethod: function () {
            if (console && console.log) {
                console.log('some method');             
            }
        }
    };

    Constructors.Person = function (name, address) {
        this.name = name;
        this.address = address;
    };

    Constructors.Person.prototype = {
        walk: function () {
            alert('STOMP!');
        }
    };

    return {
        Person: Constructors.Person, // there can be many
        PlanetEarth: new Constructors.PlanetEarth() // there can only be one!
    };

}();

由于PlanetEarth的构造函数仍然是私有的,因此只能有一个。

现在,有些东西告诉我,这种自煮熟的东西并不是最好的东西,主要是因为我没有接受过学术教育而且我倾向于以愚蠢的方式解决问题。 你会建议什么作为一种更好的替代方法,哪种更好被定义为风格更好和/或更强大?

trans by 2019-08-12T18:42:13Z

如何在TypeScript中定义Singleton

在TypeScript中为类实现Singleton模式的最佳和最方便的方法是什么? (有和没有延迟初始化)。

trans by 2019-07-26T05:42:57Z

多线程 - Java Singleton和Synchronization

请澄清我对Singleton和Multithreading的疑问:

  • 在多线程中用Java实现Singleton的最佳方法是什么?环境?
  • 当多个线程尝试访问getInstance()时会发生什么方法同时?
  • 我们可以制作单身人士的getInstance() synchronized吗?
  • 使用Singleton类时是否真的需要同步?
trans by 2019-07-22T13:13:30Z

1 2 3 下一页 共3页