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.实例方法是否应该是静态的,如果是的话,它的实现会是什么样子
是的,它应该是静态的。请查看下面的classProductFactory
和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
之前使用,因为它容易受到细微错误的攻击。上述版本比双重检查锁定更简单、更干净。