Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 工厂设计模式缺失环节的实现_Java_Oop_Design Patterns_Factory Pattern - Fatal编程技术网

Java 工厂设计模式缺失环节的实现

Java 工厂设计模式缺失环节的实现,java,oop,design-patterns,factory-pattern,Java,Oop,Design Patterns,Factory Pattern,我在中阅读了以下文章 请参阅“班级注册-避免反思”一节 在本例中,我无法理解以下代码行的含义: static { ProductFactory.instance().registerProduct("ID1", new OneProduct()); } 我不清楚的问题: 1.方法实例()在哪里定义 2.Is实例方法应该是静态的,如果是,它的实现会是什么样子? (通过静态方法无法返回此) *请坚持给定的示例,除非它是错误的,否则我试图集中于一个工厂“配方”我试图回答您的以下问题: 1.方

我在中阅读了以下文章

请参阅“班级注册-避免反思”一节

在本例中,我无法理解以下代码行的含义:

static
{
    ProductFactory.instance().registerProduct("ID1", new OneProduct());
}
我不清楚的问题:
1.方法实例()在哪里定义

2.Is实例方法应该是静态的,如果是,它的实现会是什么样子?
通过静态方法无法返回此


*请坚持给定的示例,除非它是错误的,否则我试图集中于一个工厂“配方”

我试图回答您的以下问题:

1.方法实例()在哪里定义

该方法是在类
ProductFactory
中定义的,这是显而易见的

2.实例方法是否应该是静态的,如果是的话,它的实现会是什么样子

是的,它应该是静态的。请查看下面的class
ProductFactory
instance()
方法的定义:

public class ProductFactory extends Factory
{
    private static ProductFactory _instance;
    private HashMap m_RegisteredProducts = new HashMap();

    public static synchronized ProductFactory instance()
    {
        if (_instance == null)
            _instance = new ProductFactory();
        return _instance;
    }

    public void registerProduct(String productID, Product p)    {
        m_RegisteredProducts.put(productID, p);
    }

    public Product createProduct(String productID){
        ((Product)m_RegisteredProducts.get(productID)).createProduct();
    }
}

只是一个建议-在进入工厂之前,请先了解
静态
方法,以及如何调用它们;似乎是使用@JBNizet实现的:您是否认为将factory作为Singleton模式实现总是必要的,如果不是,您是否知道如何重构给定的示例以正常工作(没有factory Singleton)?不,并不总是必要的。模式被用来解决特定的问题,并加以调整。在不知道问题的情况下推荐解决方案是我不会做的事情。你通常想要一个工厂,这会创建许多产品实例。singleton模式允许拥有单个工厂实例并从任何地方访问它。(但它也有严重的缺点,特别是在可测试性方面)。所以我猜在这个例子中,您将工厂实现为singleton(双重检查锁定版本)模式?顺便问一下,如果我选择
synchronized
而不是
this
来代替
ProductFactory.class
,那有什么区别呢?请看一下C#中这个双重检查锁的注释,它说如果没有volatile,它在java中不工作,你明白吗?Link:(版本3)关于volatile需求您怎么说?我想说的是,如果您使用
双重检查锁定
,您必须将实例声明为
volatile
。而且它不应该在
J2SE 5.0
之前使用,因为它容易受到细微错误的攻击。上述版本比双重检查锁定更简单、更干净。