Используйте фабричный метод (не абстрактную фабрику), если вы хотите повторно использовать общие функции с различными компонентами.
Пример: Представьте, что у вас есть винтовка M16. Как то так:
public class M16
{
private Scope scope = new StandardScope();
private SecondaryWeapon secondary = new Bayonet();
private Camouflage camo = new DesertCamo();
public double getMass()
{
// Add the mass of the gun to the mass of all the attachments.
}
public Point2D shootAtTarget(Point2D targetPosition)
{
// Very complicated calculation taking account of lots of variables such as
// scope accuracy and gun weight.
}
}
Вы можете быть довольны этим некоторое время, думая, что вы не хотите ничего менять. Но затем вы должны выполнить секретную ночную миссию скрытности в джунглях, и вы понимаете, что ваши привязанности совершенно неуместны. Вам действительно нужны прицел NightVision, JungleCamo и дополнительное оружие GrenadeLauncher. Вам придется скопировать код из вашего оригинального M16 ...... не очень хорошая расширяемость ..... Фабричный метод на помощь!
Перепишите свой класс M16:
public abstract class M16
{
private Scope scope = getScope();
private SecondaryWeapon secondary = getSecondaryWeapon();
private Camouflage camo = getCamouflage();
public double getMass()
{
// Add the mass of the gun to the mass of all the attachments.
}
public Point2D shootAtTarget(Point2D targetPosition)
{
// Very complicated calculation taking account of lots of variables such as
// scope accuracy and gun weight.
}
// Don't have to be abstract if you want to have defaults.
protected abstract Scope getScope();
protected abstract SecondaryWeapon getSecondaryWeapon();
protected abstract Camouflage getCamouflage();
}
//Then, your new JungleM16 can be created with hardly any effort (and importantly, no code //copying):
public class JungleM16 : M16
{
public Scope getScope()
{
return new NightVisionScope();
}
public SecondaryWeapon getSecondaryWeapon()
{
return new GrenadeLauncher();
}
public Camouflage getCamouflage()
{
return new JungleCamo();
}
}
Основная идея? Настраивайте и меняйте составные объекты, сохраняя при этом общую функциональность
Действительно полезное место для его использования:
Вы только что разработали действительно классный графический интерфейс, и он имеет действительно сложную компоновку. Было бы очень больно иметь все заново, если вы хотите иметь разные виджеты. Итак ..... используйте фабричный метод для создания виджетов. Затем, если вы передумаете (или кто-то еще захочет использовать ваш класс, но использовать другие компоненты), вы можете просто создать подкласс GUI и переопределить методы фабрики.