相关疑难解决方法(0)

简单工厂与工厂方法:在工厂与客户端中切换语句

据我所知,Factory Method比Simple Factory的主要优点之一是它不违反Open-Closed SOLID原则.也就是说,前者不需要在添加新类型时修改switch语句.

有一件我希望得到澄清.如果我要使用一个简单的工厂,我会有一个像这样的工厂(简化):

public class ObjectFactory {
    public static IObject CreateObject(ObjectTypeEnum objectType) {
        switch (objectType) {
            case TypeA:
                return ObjectA;
                break;
            case TypeB:
                return ObjectB;
                break;
            case TypeC:
                return ObjectC;
                break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并且客户端会这样称呼它:

IObject myObject = ObjectFactory.CreateObject(objectType);
Run Code Online (Sandbox Code Playgroud)

文献中的缺点是在添加新对象类型时需要修改CreateObject.

但是使用Factory方法,我们不会将此修改从工厂移动到客户端,就像这样(客户端代码):

IObject myObject;
switch (objectType) {
            case TypeA:
                myObject = ObjectAFactory.CreateObject();
                break;
            case TypeB:
                myObject = ObjectBFactory.CreateObject();
                break;
            case TypeC:
                myObject = ObjectCFactory.CreateObject();
                break;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,每次添加新类型时都需要修改客户端,而在之前的情况下需要修改工厂.那么一个优于另一个的优势是什么?请不要将此标记为重复,我已经查看了很多关于工厂的SO帖子,没有一个解决这个特定的区别.

是否有更好的解决方案不会违反客户或工厂方面的开放/封闭原则?

design-patterns factory factory-pattern open-closed-principle solid-principles

5
推荐指数
1
解决办法
3741
查看次数

什么是OOP中的工厂

我对“与工厂相关的”设计模式及其OOP实现的理解一直很简单。

  • “工厂方法”是具有的接口(或一个抽象类)作为返回类型和实现基于某些内部逻辑该接口构造的对象类内的方法。
  • 一个“工厂”是只包含工厂方法的类
  • 一个“抽象工厂”是一个接口(或一个抽象类),其仅包含工厂方法

但是我最近偶然发现了有关该主题的Wikipeda文章(FactoryAbstract factory),这使我有些困惑,尤其是关于OOP中的“ Factory”是什么。

这里有几个引号:

  1. 在工厂方法或工厂功能中,返回“新”对象的子例程可以称为“工厂”。
  2. 工厂用于各种设计模式
  3. “抽象工厂模式”是一种建立工厂集合的方法。
  4. 工厂是代码中具体类的位置,在该类中构造对象

引起一些问题:

(1)&(2)这是否意味着工厂不是类或对象,而是逻辑?

(2)“工厂”本身不是模式吗?

(3)“收藏”在这里是什么意思?只是说“您可以有多个实现相同接口的工厂(这是一个抽象工厂)”的一种方式吗?

(4)什么?

任何人都可以澄清这意味着什么吗?我对工厂的最初理解不正确吗?

oop design-patterns factory

5
推荐指数
1
解决办法
1498
查看次数

设计模式与实时示例

我想通过实时示例学习设计模式.所以任何人都可以建议我可以从哪里开始.

design-patterns

3
推荐指数
1
解决办法
2万
查看次数

C++中的抽象工厂

我试图理解抽象工厂模式,这是我的第一个近似值:

#include <iostream>
using namespace std;

class Soldier
{
    public:
    virtual void shoot()=0;
};

class Archer: public Soldier
{
    public:
    void shoot(){
        cout<<"Archer shoot"<<endl;
    }
};

class Rider: public Soldier
{
    public:
    void shoot(){
        cout<<"Rider shoot"<<endl;
    }
};

class AbstractFactory
{
    public:
    virtual Soldier* createArcher()=0;
    virtual Soldier* createRider()=0;
};

class OrcFactory: public AbstractFactory
{
    Soldier* createArcher()
    {
        return new Archer();
    };
    Soldier* createRider()
    {
        return new Rider();
    };
};

class HumanFactory: public AbstractFactory
{
    Soldier* createArcher()
    {
        return new Archer(); …
Run Code Online (Sandbox Code Playgroud)

c++ design-patterns abstract-factory

3
推荐指数
1
解决办法
3862
查看次数

如何在Java中创建自注册工厂?

工厂模式违反了 OCP 原则,因为它使用if()语句,这意味着如果添加任何类,则工厂类必须更改,这违反了 SOLID 原则。自注册类应该根据以下资源解决此问题:http://www.jkfill.com/2010/12/29/self-registering-factories-in-c-sharp/。问题是我不懂C#。有人可以用 Java 举一个例子吗?提前致谢。

public class ShapeFactory {

   //The purpose of self registering classes is to avoid if's
   public Shape getShape(String shapeType){
      if(shapeType == null){ //Get rid of this
         return null;
      }     
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();

      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();

      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }

      return null;
   }
}
Run Code Online (Sandbox Code Playgroud)

java design-patterns solid-principles

0
推荐指数
1
解决办法
2208
查看次数