[英]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();
显示混凝土工厂的名称。 这是错误吗? 多谢你们
好吧,可以肯定我不会使用这种设计! 至少由于以下原因,它会闻起来:
ShapeFactory.getShape()
使用一种开关,它不是面向对象的设计。 ShapeFactory
的编译时依赖于所有Shape对象。 ShapeFactory
没有控制权的ShapeFactory
想如何添加新形状……不可能! 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.