【问题标题】:Abstract Factory Pattern Explanation抽象工厂模式解释
【发布时间】:2016-07-21 21:30:19
【问题描述】:

我在研究设计模式时遇到了Abstract Factory Pattern,它的定义是:

抽象工厂模式说只定义一个接口或 用于创建相关(或依赖)对象系列的抽象类 但没有指定它们的具体子类。这意味着抽象 工厂让一个类返回一个类工厂。

但我无法彻底理解它。我什至浏览了this linkthis question 中给出的一些示例,但没有任何帮助。

谁能通过Abstract Factory Pattern 的简单现实生活示例以及我们应该使用这种设计模式的情况提供一个清晰的解释。

【问题讨论】:

标签: design-patterns abstract-factory


【解决方案1】:

这是抽象工厂模式的流程,用java实现

//创建一个shape接口和实现类shape

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

//这是demo类,比如dealer会要求投资人建shape factory 然后这家工厂可以生产矩形、正方形等。

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

【讨论】:

  • 简单明了的解释......正是我想要的......谢谢:)
【解决方案2】:

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

如您所见,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());
    }
}

【讨论】:

    【解决方案3】:

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

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

    那么有什么不同呢?

    1. 从中获取数据的端点。

    2. 您希望针对各种事件触发的分析(当用户滚动某些视图、单击某些视图、页面加载时、用户导航到下一页时等)

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

    您可以封装变化的内容并将它们放入单独的类中。像这样的

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

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

    所以也许你可以把你的代码改成:

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

    我们刚刚实现了一个抽象工厂!!!我希望我的例子很清楚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多