Инструменты пользователя

Инструменты сайта


pattern_abstract_factory

Назад

Абстрактная фабрика предоставляет интерфейс создания семейств взаимоувязанный или взаимозависимых объектов без указания их конкретных классов.

Задача Абстрактная фабрики создать семейств взаимосвязанных объектов без зависимости от их конкретных классов.

Плюсы

  1. изолирует конкретные классы;
  2. упрощает замену семейств продуктов;
  3. гарантирует сочетаемость продуктов.

Минусы

  1. сложно добавить поддержку нового вида продуктов.

Выводы: Абстрактная фабрика очень сильно похоже на реализацию фабричного метода но абстрактная фабрика используется для создание семейств объектов для обеспечения логики, а фабричный метод будет полезный от создания экземпляров конкретных классов и когда точный состав всех конкретных классов неизвестен.

Car
public interface Car
{
    public String getCar();
}
 
class Toyota implements Car
{
    public Toyota(){};
    public String getCar()
    {
        return "Toyota";
    }
}
 
class Nissan implements Car
{
    public String getCar()
    {
        return "Nissan";
    }
}
Telephone
public interface Telephone
{
    public String getTelephone();
}
 
class Nokia implements Telephone
{
    public String getTelephone()
    {
        return "Nokia";
    }
}
 
class Sony implements Telephone
{
    public String getTelephone()
    {
        return "Sony";
    }
}
Factory
public interface Factory
{
    public Telephone createTelephone();
    public Car createCar();
}
 
class CreateA implements Factory
{
    public Telephone createTelephone()
    {
        return new Nokia();
    }
 
    public Car createCar()
    {
        return new Toyota();
    }
}
 
class CreateB implements Factory
{
    public Telephone createTelephone()
    {
        return new Sony();
    }
 
    public Car createCar()
    {
        return new Nissan();
    }
}
Main
public class Main
{
    public static void main(String[] args)
    {
        Factory createA = new CreateA();
        Factory createB = new CreateB();
 
        Car car;
        System.out.println("-----Car-----");
        car = createA.createCar();
        System.out.println(car.getCar());
        car = createB.createCar();
        System.out.println(car.getCar());
 
        Telephone tel;
        System.out.println("-----Telephone-----");
        tel = createA.createTelephone();
        System.out.println(tel.getTelephone());
        tel = createB.createTelephone();
        System.out.println(tel.getTelephone());        
    }
}