[英]Which is better way for creating factory class
我已经创建了工厂类,我想知道哪种更好的方法来实现它。 选项1
public class Factory {
private IProperty prop;
public IDoc doc;
public Factory(int version) {
switch (version) {
case '1':
prop = new Prop();
doc = new Docu();
...
case '2':
prop = new Prop1();
doc = new Docu1();
...
}
}
public IProperty getProperty() {
return this.prop;
}
public IDoc getDoc() {
return this.doc;
}
}
我的问题是,是否要像这样用接口类型定义成员并打开构造函数,或者让每个get方法在构造函数上使用switch语句,所以在构造函数中,我只会获取版本并保存它在类成员上,比例如使用
public IProperty getProperty() {
switch (version) {
case '1':
prop = new Prop();
case '2':
prop = new Prop1();
...
那么,更好的方法是什么?
最干净的方法是将您的工作公开为两个独立的工厂,如果它们有任何共享的对象,则为它们提供通用的抽象基础或可重用的策略参数。 一种工厂类型应仅创建一种特定对象(例如,仅使用塑料工具)。 工厂的公共配置通常仅保留创建对象所需的属性(供应商的联系方式,专利)或正在创建的对象的静态属性(例如塑料的类型),而不包含对象的类型/类别。
另外,像您的示例#1中那样存储长期对象的东西可能应该称为“上下文”,而不是“工厂”。
下面的代码示例。
public interface IFactory {
IDoc createDoc();
IProp createProp();
}
public class Type1Factory implements IFactory {
@Override public IDoc createDoc() { return new Doc1(); }
@Override public IProp createProp() { return new Prop1(); }
}
第二种方法总是更好,因为get*
方法的每个调用者都会收到该对象的新实例。 如果在构造函数中创建两个对象,则必须处理对象共享问题(如果在不同线程中使用这些对象,则还要解决)。
在第一个版本中,创建工厂的想法比第二个版本要好得多。
理想情况下,它不应是工厂类的构造函数,而应是静态方法。
public class Factory
{
public static IProperty getPropertyObject(char version)
{
switch (version)
{
case '1':
return new Prop();
case '2'
return new Prop1();
}
}
public static IDoc getDocObject(char version)
{
switch (version)
{
case '1':
return new Doc();
case '2'
return new Doc1();
}
}
}
这取决于您的情况。
第一个选项建议您的IProperty
和IDoc
具有不同的版本,但是对于一个版本的每个版本,您都具有另一个版本。
尽管第二种选择表明这些版本可能彼此独立。
首先,理想情况下, Factory
应具有static references
而不non-static
static references
。 并且它应该具有static method
来创建/获取适当的实例。
其次,最好有两个不同类型的工厂 。
createProperty
,而不是getPropertyObject
,因为该方法不返回已创建的实例,而是返回其创建实例。 当然, getPropertyObject('1')
似乎是从持久性存储中获取该版本的property
,而不是它正在做什么。 而是根据版本创建实例。
( 注:- static factory methods
名称很重要。它们是constructors
优于constructors
的优点之一。由于有了name
,您可以猜测factory method
确切作用)
话虽如此,我想说,所有这些更改都会使2nd option
更好。 让createProperty
方法决定如何创建instance
。
因此,我将这样修改您的代码:-
public class PropertyFactory {
private static IProperty prop;
public static createProperty(char version) {
switch (version) {
case '1':
prop = new Prop();
break; // Don't forget a `break` here.
case '2':
prop = new Prop1();
break;
default: // do have a default case
prop = null;
}
return prop;
}
}
同样,您可以创建一个DocumentFactory
来创建一个document object
。 命名方法: createDocument(char version)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.