Принудить кого-то использовать только фабрику для создания объектов - PullRequest
0 голосов
/ 09 января 2019

У меня есть интерфейс Shape и классы Circle и Triangle, которые реализуют интерфейс Shape. Допустим, метод printShape(), который просто печатает тип фигуры.

Теперь существует один класс фабрики, т.е. ShapeFactory, основанный на шаблоне фабричной конструкции, который предоставляет объекты Circle и Triangle.

Теперь я хочу заставить всех использовать ShapeFactory для создания объектов Circle и Triangle.

Может быть, если кто-то не знает о существовании ShapeFactory, тогда он / она может создать объект с помощью new без использования Shapefacoty. Я хочу, чтобы никто не создавал объект типа Shape shape = new Circle.

Как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Что ж, если вы не хотите, чтобы кто-либо мог использовать класс , кроме классов в вашем собственном пакете , то просто сделайте эти классы 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();
    }
}
0 голосов
/ 09 января 2019

enter image description here

    // this class is in package scope, nobody can access it outside this package
class ShapeImpl1 implements Shape {

        // default is package scope
        ShapeImpl1() {
        }

        @Override
        public void print() {

        }
    }

    public class ShapeFactory {


        public Shape buildShape() {
            return new ShapeImpl1();
        }
    }
...