Что ж, если вы не хотите, чтобы кто-либо мог использовать класс , кроме классов в вашем собственном пакете , то просто сделайте эти классы package-private .
ЕСЛИ вы хотите запретить классам даже из того же пакета, что и ShapeFactory, использовать классы, реализующие интерфейс Shape
, то пропустите первый пример и перейдите к примеру ниже ОБНОВЛЕНИЕ цитата.
Посмотрите на приведенный ниже пример, демонстрирующий использование пакетов.
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, знали, как его использовать!
UPDATE
Несмотря на то, что приведенная выше методология верна и обеспечит запрашиваемую функциональность, приведенная ниже парадигма покажет, как предотвратить другие классы (даже из одного пакета), чтобы они могли использовать классы, которые реализовать интерфейс 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
) , ONLY через ShapeFactory
.
//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();
}
}