Я пытался создать фабрику (на Java), которая запрещает подклассификацию фабричного продукта и предотвращает использование конкретных заводов кем-либо, кроме абстрактной фабрики. Что вы думаете об этом ...Factory pattern
class Client
{
public static void main(String[] args)
{
Animal animal = Animal.create(Lion.class);
animal.doGrowl();
animal = Animal.create(Cow.class);
animal.doGrowl();
}
}
final class Animal
{
private Growl growl = null;
private Animal()
{
}
public void doGrowl()
{
growl.exec();
}
public abstract class Growl
{
public abstract void exec();
public final void initialize()
{
if (growl != null)
{
throw new IllegalStateException("Already initialized.");
}
growl = this;
}
}
public abstract static class Factory
{
public Factory(FactoryInitializer initializer)
{
initializer.validate();
}
public abstract void attachGrowl(Animal a);
}
public static final class FactoryInitializer
{
private boolean isValid = true;
private FactoryInitializer()
{
}
public void validate()
{
if (isValid)
{
isValid = false;
}
else
{
throw new IllegalStateException("FactoryInitializer is not valid.");
}
}
}
public static Animal create(Class<? extends Factory> factoryClass)
{
try
{
Constructor constructor = factoryClass.getConstructor(new Class[]{FactoryInitializer.class});
Factory factory = (Factory) constructor .newInstance(new Object[]{new FactoryInitializer()});
Animal animal = new Animal();
factory.attachGrowl(animal);
if (animal.growl == null)
{
throw new IllegalStateException("Animal factory did not initialize Growl.");
}
return animal;
}
catch (Exception e)
{
return null;
}
}
}
class Lion extends Animal.Factory
{
public Lion(Animal.FactoryInitializer initializer)
{
super(initializer);
}
public void attachGrowl(Animal a)
{
a.new Growl()
{
public void exec()
{
System.out.println("rarrrrrr");
}
}.initialize();
}
}
class Cow extends Animal.Factory
{
public Cow(Animal.FactoryInitializer initializer)
{
super(initializer);
}
public void attachGrowl(Animal a)
{
a.new Growl()
{
public void exec()
{
System.out.println("mmooooo");
}
}.initialize();
}
}
Можете ли вы дать английское описание проблемы реального мира, к которой это относится? – TofuBeer
Я спросил об этом некоторое время назад и никогда не объяснял, почему я хотел это знать. В основном я создавал модульный музыкальный синтезатор (например, Music N) и хотел, чтобы пользователи api могли реализовать свои собственные генераторы устройств, которые в основном представляют собой объекты, которые синтезируют или обрабатывают сигнал (массив float) и могут быть соединены вместе. Наверное, я был просто расстроен, никто не видел для этого значения. –
Если я правильно помню, я хотел запретить подклассирование, потому что я хотел призвать пользователей api разбить вещи на повторно используемые, подключаемые части (не один гигантский подкласс подкласса ...), и я хотел заставить их реализовать абстрактный метод - тот, который обрабатывает входной сигнал и выводит результат. –