2016-07-21 3 views
2

я изучал образцы дизайна и наткнулся на Abstract Factory Pattern который по определению:Abstract Factory Pattern Объяснение

Abstract Factory Pattern говорит, что просто определить интерфейс или абстрактный класс для создания семейств связанных (или зависимых) объекты , но без указания их конкретных подклассов. Это означает Abstract Factory позволяет классу возвращать фабрику классов.

Но я не могу его полностью понять. Я даже рассмотрел некоторые примеры, приведенные в this link и this question, но ничего не помогло.

Может ли кто-нибудь дать четкое объяснение с помощью простого примера реальной жизни Abstract Factory Pattern и случаев, когда мы должны использовать этот шаблон дизайна.

+0

вы можете найти здесь свой ответ. [http://stackoverflow.com/a/2280289/6006433](http://stackoverflow.com/a/2280289/6006433) –

ответ

1

Это поток реферативных фабричных pattern.Its реализованы в Java

// создать интерфейс формы и классы реализатор формы

public interface Shape { 
    void draw(); 
} 

public class Rectangle implements Shape { 

    @Override 
    public void draw() { 
     System.out.println("Inside Rectangle::draw() method."); 
    } 
} 

public class Square implements Shape { 

    @Override 
    public void draw() { 
     System.out.println("Inside Square::draw() method."); 
    } 
} 

// создать цветовой интерфейс и его внедренцев

public interface Color { 
    void fill(); 
} 

public class Red implements Color { 

    @Override 
    public void fill() { 
     System.out.println("Inside Red::fill() method."); 
    } 
} 


public class Blue implements Color { 

    @Override 
    public void fill() { 
     System.out.println("Inside Blue::fill() method."); 
    } 
} 

// создаем абстрактный заводский класс, который обычно является классом, который генерирует интерфейсы или на простом языке фабрика, которая может производить все, что вы, как k от него

public abstract class AbstractFactory { 
    abstract Color getColor(String color); 
    abstract Shape getShape(String shape) ; 
} 

// создайте фабрику форм так же, как вы знаете, что обычные фабрики производят вещи. Это завод, который производит shapes.you просто дать ему имя формы вы хотите, и он будет производить его

public class ShapeFactory extends AbstractFactory { 

    @Override 
    public Shape getShape(String shapeType){ 

     if(shapeType == null){ 
     return null; 
     }  

     if(shapeType.equalsIgnoreCase("RECTANGLE")){ 
     return new Rectangle(); 

     }else if(shapeType.equalsIgnoreCase("SQUARE")){ 
     return new Square(); 
     } 

     return null; 
    } 

    @Override 
    Color getColor(String color) { 
     return null; 
    } 
} 

// цвет завод .Это фабрика, которая производит цвета. вы просто дать ему название цвета, который вы хотите, и он будет производить его

public class ColorFactory extends AbstractFactory { 

    @Override 
    public Shape getShape(String shapeType){ 
     return null; 
    } 

    @Override 
    Color getColor(String color) { 

     if(color == null){ 
     return null; 
     }  

     if(color.equalsIgnoreCase("RED")){ 
     return new Red(); 

     }else if(color.equalsIgnoreCase("BLUE")){ 
     return new Blue(); 
     } 

     return null; 
    } 
} 

// производит заводы .Теперь этот класс, как инвестор, который строит заводы. дайте ему имя, и он построит для вас фабрику, которая производит это.

public class FactoryProducer { 
    public static AbstractFactory getFactory(String choice){ 

     if(choice.equalsIgnoreCase("SHAPE")){ 
     return new ShapeFactory(); 

     }else if(choice.equalsIgnoreCase("COLOR")){ 
     return new ColorFactory(); 
     } 

     return null; 
    } 
} 

// Это демонстрационный класс, как у дилера, который будет просить инвестора построить форму завода и этот завод может производить то прямоугольники, квадраты и т.д.

public class AbstractFactoryPatternDemo { 
    public static void main(String[] args) { 

     //get shape factory 
     AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE"); 


     //get an object of Shape Rectangle 
     Shape shape2 = shapeFactory.getShape("RECTANGLE"); 

     //call draw method of Shape Rectangle 
     shape2.draw(); 

     //get an object of Shape Square 
     Shape shape3 = shapeFactory.getShape("SQUARE"); 

     //call draw method of Shape Square 
     shape3.draw(); 

     //get color factory 
     AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR"); 

     //get an object of Color Red 
     Color color1 = colorFactory.getColor("RED"); 

     //call fill method of Red 
     color1.fill(); 


     //get an object of Color Blue 
     Color color3 = colorFactory.getColor("BLUE"); 

     //call fill method of Color Blue 
     color3.fill(); 
    } 
} 
+0

Простые и понятные объяснения ... только то, что я хотел .. спасибо –

+0

good it был полезен. – henrybbosa

0

Ключевое слово для абстрактная фабрика - это «семьи». Ниже мой очень простой пример.

Как вы можете видеть, Босс не должен знать, что это за завод, если это VehichleFacotry. Boss просто вызывает Build(), и создается относительное транспортное средство.

abstract class Vehicle { } 

class Car : Vehicle { } 

class Bus : Vehicle { } 

abstract class VehicleFactory 
{ 
    abstract Vehicle Build();  
} 

class CarVehicleFactory : VehicleFacory 
{ 
    Vehicle Build() 
    { 
     return new Car(); 
    } 
} 

class BusVehicleFactory : VehicleFacory 
{ 
    Vehicle Build() 
    { 
     return new Bus(); 
    } 
} 

public class Boss 
{ 
    public void Order(VehicleFactory factory) 
    { 
     var vehicle = factory.Build(); 
     //do something else ... 
    } 
} 

public class Foo 
{ 
    public void Bar() 
    { 
     var boss = new Boss(); 

     boss.Order(new CarVehicleFactory()); 
     boss.Order(new BusVehicleFactory()); 
    } 
} 
0

Предположим, вы разрабатываете страницу, в которой вам нужно получить данные с сервера (с подкачкой), вызвать некоторые аналитики события и имеет настраиваемые представления.

Теперь вы хотите, чтобы эта страница была достаточно общей для использования всеми, кто хочет использовать тот же набор функций.

Так что может отличаться?

  1. Конечная точка, откуда вы извлекаете данные.

  2. Analytics вы хотите, чтобы вызвать для различных событий (при прокрутке некоторых взглядов, нажмите на какой-то точки зрения, при загрузке страницы, когда пользователь переходит на следующую страницу и т.д.)

  3. Различные элементы меню для разных страниц.

Вы можете инкапсулировать то, что меняется, и поместить их в отдельные классы. Что-то вроде этого

class MyPage { 
    IDataFetcher datafetcher; 
    IAnalyticsHelper analyticsHelper; 
    IMenuBuilder menuBuilder; 
} 

Теперь ваш класс MyPage зависит от этих классов для отображаемой страницы. Но если вы внимательно наблюдаете, это семейство алгоритмов, которые будут работать вместе, чтобы сделать страницу. (Большой намек на то, что вы можете использовать абстрактную фабрику).

Так, вероятно, вы могли бы изменить свой код:

public interface IPageAbstractFactory { 
     IDataFetcher getDatafetcher(); 
     IAnalyticsHelper getAnalyticsHelper(); 
     IMenuBuilder getMenuBuilder(); 
} 

class MyPage { 
     IPageFactory factory; 
    } 

Мы просто реализовали абстрактную фабрику !!! Надеюсь, мой пример ясен.