Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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
Design patterns 工厂方法实现_Design Patterns - Fatal编程技术网

Design patterns 工厂方法实现

Design patterns 工厂方法实现,design-patterns,Design Patterns,我实施了以下工厂方法: class A { } class A1:A { } class A2:A { } static class Factory { public static A GetInstance(int i) { if (i == 1) return new A1(); else if (i == 2) return new A2(); else

我实施了以下工厂方法:

 class A
{

}
class A1:A
{

}

class A2:A
{

}
static class Factory
{
    public static A GetInstance(int i)
    {
        if (i == 1)
            return new A1();
        else if (i == 2)
            return new A2();
        else
            return null;

    }
}
我想在下面的类方法f1()中使用工厂。方法f1()将从其派生类调用。我可以采用以下方法:

方法1:

class MyClass
{
    private A obj = null;
    public void f1()
    {
        obj = Factory.GetInstance(1);
    }

}
方法2:

class MyClass2
{
    protected  A obj { get; set; }
    protected void f1()
    {
        obj = Factory.GetInstance(1);
    }

}
哪种方法更好?我需要保护属性和方法吗? 这些方法的优缺点是什么?

方法1


通常但并非总是希望继承方法而不是数据。f1()函数将使用工厂构造obj,因此无需使用set方法。F1()可以保持受保护,每个派生类可以调用F1()来获得自己的对象实例,但是如果需要与其他人共享这个特定实例,则只需在MyClass中创建一个GETOBJ公共方法,可以返回C++中的const引用或java中的最终引用或C++中的副本或java中的克隆。(不确定c#是否完全相同),但在MyClass中仍然有您的obj私有实例。

Woah!文本墙。您可以稍微拆分一下吗?