代码之家  ›  专栏  ›  技术社区  ›  Sam

单重工厂法

  •  4
  • Sam  · 技术社区  · 16 年前

    在工厂方法中有可能有一个单变量吗?我有许多域使用工厂方法。我该怎么解决这个问题。请帮我举个例子。

    5 回复  |  直到 6 年前
        1
  •  6
  •   Chris B.    16 年前

    在本例中,我相信您希望同步getInstance()方法,以确保两个线程不会同时进入它。否则,两个线程可能会在实例化singleton的块中结束,这是非常有问题的。此解决方案的唯一问题是,每次调用getInstance()时,都要为方法的同步支付额外费用。 例子:

    public static synchronized Singleton getInstance()
    {
       // since whole method is synchronized only 1 thread can 
       // enter the following block ensuring only one instance 
       // is ever created. however we pay a synchronization
       // penalty every time this method is called.
       if(mInstance==null) { 
          mInstance=new Singleton();
       }
       return mInstance;
    }
    

    或者,如果初始化成本较低(既保证并发性,又不为调用getInstance()方法支付同步惩罚),则还可以切换到使用单例实例的紧急初始化,而不是延迟初始化。 例子:

    // no synchronization penalty, but penalty for eager init
    private static Singleton mInstance = new Singleton();                          
    
    public static Singleton getInstance()
    {
        return mInstance;
    }
    

    最优化的方法是使用双重检查锁定,您需要Java 1.5或更新的,因为在1.4或更旧的JVM中易失性关键字的实现不同(请参阅由O'ReLyLediaInc.出版的第5章P.182)。我第一次读到这个。) 例子:

    private volatile static Singleton mInstance;
    
    private Singleton(){}
    
    public static Singleton getInstance()
    {
       if(mInstance==null) {
          synchronized (Singleton.class) { 
              // only pay synchronization penalty once
              if(mInstance==null){
                  mInstance=new Singleton();
              }
          }
       }
       return mInstance;
    }
    
        2
  •  4
  •   callmebob ani627    6 年前

    “…为创建单例类实例的对象创建接口。这本质上是GOF书中抽象工厂、工厂方法和函子模式的结合。”

    /**
     * An interface defining objects that can create Singleton
     * instances.
     */
    public interface SingletonFactoryFunctor {
       /**
        * @return An instance of the Singleton.
        */
       public Singleton makeInstance();
    }
    
        3
  •  3
  •   Bill the Lizard Hacknightly    16 年前

    你应该打电话给你的 Singleton getInstance() 方法来自工厂方法。这个 获取实例() 逻辑应该处理返回单例的一个实例的细节。

        4
  •  2
  •   Markus Lausberg    16 年前

    您可以实现如下单例:

    public class Singleton {
    
    private static Singleton mInstance;
    
    private Singleton(){}
    
    public static Singleton getInstance()
    {
       if(mInstance==null){
          mInstance=new Singleton();
       }
    return mInstance;
    }
    
    }
    

    这个类可以在您想要的每个工厂方法中返回,就像前面描述的mepcotterell一样。

        5
  •  0
  •   rpc1    9 年前

    这个例子不是一个正式的工厂模式(gof),但是如果您像 Static Factory Method

    abstract class Product {
    
    }
    
    class ConcreteProduct extends Product{
    
    }
    
    class ProductSupportFactory {
    
        private static ProductSupportFactory instance = null;
        private ConcreteProduct product = null;
    
        static {
            instance = new ProductSupportFactory();
        }
        private ProductSupportFactory() {
    
            product = new ConcreteProduct(); //object initialization
        }
    
        public static ProductSupportFactory getInstance(){
            return instance;
        }
    
        public ConcreteProduct getProduct() {
            return product;
        }
    
        public void setProduct(ConcreteProduct product) {
            this.product = product;
        }
    
    }
    
    public class ProductConsumer {
    
        public static void main(String args[]){ //client
    
            ConcreteProduct uniqueInstance = ProductSupportFactory.getInstance().getProduct();
            ConcreteProduct sharedInstance = ProductSupportFactory.getInstance().getProduct(); //same object hash
    
        }
    }