我有一个Shape接口,并具有实现Circle接口的TriangleShape类。可以说方法是printShape(),它只是打印形状的类型。

现在有一个工厂类,即基于工厂设计模式的ShapeFactory,提供了CircleTriangle对象。

现在,我想强制所有人使用ShapeFactory创建CircleTriangle的对象。

可能是如果某人不知道ShapeFactory存在,那么他/她可以使用new创建对象而无需使用Shapefacoty。我希望没有人可以创建像Shape shape = new Circle这样的对象。

我怎么做?

最佳答案

好吧,如果您不希望任何人都可以使用除您自己的软件包中的类之外的其他类,则只需将这些类设为私有软件包即可。

如果要禁止甚至与ShapeFactory相同的程序包中的类使用实现Shape接口的类,则跳过第一个示例,并转到UPDATE引号下面的示例。

请看下面的示例,其中展示了软件包的用法。

package Shapes;

class Circle implements Shape{
//implementation
}




package Shapes;

class Triangle implements Shape{
//implementation
}




package Shapes;

public class ShapeFactory{

  public static Triangle createTriangle(){
    return new Triangle();
  }

  public static Circle createCircle(){
    return new Circle();
  }
}




package SomeOtherPackage;
import Shapes.ShapeFactory;

public class OtherClass{
  Shape myCircle = ShapeFactory.createCircle();
  Shape myTriangle = ShapeFactory.createTriangle();
}


最后,至于如果用户不知道ShapeFactory存在该怎么办?题。
这就是为什么存在文档的原因。为了让其他程序员使用您的API,知道如何使用它!


  更新
  
  即使上面的方法是正确的并且将提供所要求的功能,下面的范例也将演示如何防止其他类(即使来自同一包)也不能使用实现Shape接口的类。他们将只能通过ShapeFactory()创建其他形状。


//ShapeFactory can be public, or package-private. Depends on programmer's needs
public class ShapeFactory {

    //If factory methods are static, then inner classes need to be static too!
    public static Circle createCircle(){
        return new Circle();
    }

    public static Triangle createTriangle(){
        return new Triangle();
    }


    /*Inner classes must  be set to private, to mask their existance
     from all other classes, except ShapeFactory. Static is only needed
     if the factory method that produces an instance of said class, is
     going to be static itself.*/
    static private class Circle implements Shape{
        private Circle(){
            //Circle implementation
        }
    }

    static private class Triangle implements Shape{
        private Triangle(){
            //triangle implementation
        }
    }

    //More inner classes, etc..

}



  如上创建ShapeFactory后,只能通过ShapeFactory从任何其他包的任何类(甚至从与ShapeFactory相同的包中)实例化Shapes。


//An arbitrary class that can belong to any package
public class ArbitraryClass {

    public static void main(String[] arguments){
        //creation of Shapes using ShapeFactory
        Shape myCircle = ShapeFactory.createCircle();
        Shape myTriangle = ShapeFactory.createTriangle();
    }
}

09-11 18:31