抽象工厂模式解释

时间:2016-07-21 12:54:08

标签: design-patterns abstract-factory

我正在研究设计模式并遇到了Abstract Factory Pattern,根据定义是:

  

抽象工厂模式说只需定义一个接口或   用于创建相关(或从属)对象族的抽象类   但是没有具体说明它们的具体子类。这意味着抽象   Factory允许类返回类的工厂。

但我无法彻底理解它。我甚至经历了this linkthis question中给出的一些例子,但没有任何帮助。

任何人都可以用Abstract Factory Pattern的简单实际例子以及我们应该使用这种设计模式的情况提供清晰的解释。

3 个答案:

答案 0 :(得分:1)

这是抽象工厂模式的流程。它在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.");
   }
}

//创建抽象工厂类,它通常是一个生成接口的类,或者用简单的语言创建一个工厂,可以制造你所要求的任何东西

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

//创建形状工厂,就像你知道普通工厂制造东西一样。这是制造形状的工厂。你只要给它你想要的形状的名称,它将制造它

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();
   }
}

答案 1 :(得分:0)

抽象工厂的关键词是“家庭”。以下是我非常简单的例子。

正如你所看到的,Boss不需要知道它是什么类型的工厂,只要它是VehichleFacotry。 Boss只需调用Build()并创建相对的Vehicle。

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());
    }
}

答案 2 :(得分:0)

假设您正在设计一个页面,您需要在该页面中从服务器获取数据(使用分页),触发一些分析事件并具有可自定义的视图。

现在,您希望此页面具有足够的通用性,以供希望使用相同功能集的任何人使用。

那么可能会有什么不同?

  1. 您获取数据的端点。

  2. 您想要触发各种事件的分析(当用户滚动某些视图,点击某个视图,页面加载,用户导航到下一页等时)

  3. 不同页面的不同菜单项。

  4. 您可以封装各种不同的内容并将它们放入单独的类中。像这样的东西

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

    现在,您的MyPage类依赖于要呈现的页面的这些类。但是,如果你仔细观察,这些算法系列将协同工作以呈现页面。 (一个很大的提示,你可以使用抽象工厂)。

    所以你可能可以将代码更改为:

    public interface IPageAbstractFactory {
          IDataFetcher getDatafetcher();
          IAnalyticsHelper getAnalyticsHelper();
          IMenuBuilder getMenuBuilder();
    }
    
    class MyPage {
          IPageFactory factory;
        }
    
      

    我们刚刚实施了一个抽象工厂!我希望我的榜样很清楚。