繁体   English   中英

抽象工厂模式-实现它的正确方法

[英]Abstract Factory Pattern - Right way to implement it

这是我的代码

public class FactoryPatternDemo {
public static void main(String[]args)
{
    AbstractFactory shapeFactory=new ShapeFactory();

    //tramite la fabbrica di figura geometrica disegno un rettangolo..
    Shape shape1=shapeFactory.getShape("rEcTaNgLe");
    shape1.draw();

    System.out.println();

    //..e un triangolo
    Shape shape2=shapeFactory.getShape("triangle");
    shape2.draw();
}

形状工厂:

public class ShapeFactory extends AbstractFactory{

public ShapeFactory(){

}

@Override
public Shape getShape(String shapeType)
{
    if (shapeType==null)
            return null;
    if (shapeType.equalsIgnoreCase("RECTANGLE"))
            return new Rectangle();
    if (shapeType.equalsIgnoreCase("TRIANGLE"))
            return new Triangle();
    return null;
}

抽象工厂:

public abstract class AbstractFactory {
public abstract Shape getShape(String shapeType);}

抽象产品

public interface Shape {
void draw();}

混凝土产品#1

public class Rectangle implements Shape {

@Override
public void draw() {
    for(int i=0; i<5; i++)
    {
        if(i==0 || i==4)
        {
            for(int j=0; j<10; j++)
            {
                System.out.print("*");
            }
        }
        else
        {
            for(int j=0; j<10; j++)
            {
                if(j==0||j==9)
                    System.out.print("*");
                else
                    System.out.print(" ");
            }
        }
        System.out.print("\n");
    }

}

我的问题是:这是实现抽象工厂模式的正确方法吗? 客户端应该只能看到FactoryPatternDemo类中的抽象事物或接口,但是以下代码行:

 AbstractFactory shapeFactory=new ShapeFactory();

显示混凝土工厂的名称。 这是错误吗? 多谢你们

好吧,可以肯定我不会使用这种设计! 至少由于以下原因,它会闻起来:

  1. ShapeFactory.getShape()使用一种开关,它不是面向对象的设计。
  2. ShapeFactory的编译时依赖于所有Shape对象。
  3. 没有人可以扩展您的库! 试想一下,一个对您的ShapeFactory 没有控制权的ShapeFactory想如何添加新形状……不可能!
  4. 我看不到任何为什么AbstractFactory应该是抽象类而不是接口的原因。 在我看来,这似乎是C ++的遗产,而不是Java设计。

看一下java.sql.DriverManager.getConnection(connectionString)方法的实现方式。 最好的方法是观看源代码。

非常粗略的想法总结(它隐藏在许多私有方法中)。 尽管没有驱动程序的链接列表,但它或多或少是责任链的一种实现。

DriverManager管理驱动程序列表。 每个驱动程序必须通过调用其方法registerDriver()来向DriverManager注册自己。 在请求连接时, getConnection(connectionString)方法顺序调用向驱动程序传递getConnection(connectionString)的驱动程序。 如果给定的连接字符串在其权限范围内,则每个驱动程序都会知道。 如果是,它将创建连接并返回它。 否则,控制权将传递给下一个驱动程序。 比喻:

  • 驱动程序:您的具体ShapeFactories
  • 连接字符串:形状的类型
  • 连接:形状的实例

我会尝试这样的事情:

public class ShapeManager {
    public void registerFactory(ShapeFactory factory) {
        // store the factory to the internal list
    }
    public shape getShape(String shapeType) {
        // go through the list of registered factories until one of them returns non-null
    }
}

public interface ShapeFactory {
    /**
     * Returns an instance of a shape, if shapeType is supported
     */
    public shape getShape(String shapeType);
}

public class TriangleFactory implements ShapeFactory {
    public static final String SHAPE_TYPE = "Triangle";
    @Override 
    public shape getShape(String shapeType) {
        if (SHAPE_TYPE.equals(shapeType) {
            return new Triangle();
        }
    }
}

public class RectangleFactory implements ShapeFactory {
    public static final String SHAPE_TYPE = "Rectangle";
    @Override 
    public shape getShape(String shapeType) {
        if (SHAPE_TYPE.equals(shapeType) {
            return new Triangle();
        }
    }
}

public class Client {
    ShapeFactory factory;

    // This is performed somehow on a global level, maybe by Spring configuration or so
    // However it is *not* part of the ShapeFactory so anyone may add their own shapes,
    // apart from those provided by default by your shape library.
    public void setUp() {
       factory = new ShapeFactory();
       factory.registerFactory(new TriangleFactory());
       factory.registerFactory(new RectangleFactory());
    }

    public void use() {
        final Shape triangle = factory.getShape("Triangle");
        final Shape rectangle = factory.getShape("Rectangle");
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM