资讯专栏INFORMATION COLUMN

Design Pattern - Abstract Factory Pattern(译)

王笑朝 / 3469人阅读

摘要:原文链接译者个人翻译,水平有限,如有错误欢迎指出,谢谢设计模式抽象工厂模式抽象工厂的核心是一个超级工厂,而这个工厂能创建其他的工厂。在抽象工厂模式中,一个接口负责创建抽象与一个工厂相关的对象,不需要显示的指定它们的类。

原文链接
译者:smallclover
个人翻译,水平有限,如有错误欢迎指出,谢谢!

设计模式-抽象工厂模式

抽象工厂的核心是一个超级工厂,而这个工厂能创建其他的工厂。所以,这个超级工厂也被叫做工厂的工厂。这种类型的设计模式是创建型模式下生成对象的最好的方式之一。
在抽象工厂模式中,一个接口负责创建(抽象)与一个工厂相关的对象,不需要显示的指定它们的类。每一个被生成的工厂能按照工厂模式生产对象。

实现

我们将创建ShapeColor 接口以及实现它们的具体类。接下来我们将会创建一个抽象的工厂类AbstractFactory。定义工厂类ShapeFactoryColorFactory,并且继承AbstractFactory类。然后,创建FactoryProducer工厂生产者类。
AbstractFactoryPatternDemo,我们的demo类通过FactoryProducer来获得一个AbstractFactory 对象。Demo类通过将图形信息(圆/矩形/正方形)传递到AbstractFactory来获得它所需要的类型的对象。同时也可以传递颜色信息(红色/绿色/蓝色)到AbstractFactory来获得demo类所需要的类型的对象。

第一步

创建一个图形接口
Shape.java

public interface Shape {
   void draw();
}
第二步

创建实现相同接口的具体类(Shape interface)
Rectangle.java

public class Rectangle implements Shape {

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

Square.java

public class Square implements Shape {

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

Circle.java

public class Circle implements Shape {

   @Override
   public void draw() {
      System.out.println("Inside Circle::draw() method.");
   }
}
第三步

创建一个颜色接口。
Color.java

public interface Color {
   void fill();
}
第四步

创建实现相同接口的具体类(Color interface)
Red.java

public class Red implements Color {

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

Green.java

public class Green implements Color {

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

Blue.java

public class Blue implements Color {

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

创建一个抽象类来获取与工厂相对应的Color和Shape对象。
AbstractFactory.java

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

第六步

创建多个继承AbstractFactory的工厂类根据传送的信息生成具体类的对象。
ShapeFactory.java

public class ShapeFactory extends AbstractFactory {
    
   @Override
   public Shape getShape(String shapeType){
   
      if(shapeType == null){
         return null;
      }        
      
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();
         
      }else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();
         
      }else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }
      
      return null;
   }
   
   @Override
   Color getColor(String color) {
      return null;
   }
}

ColorFactory.java

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("GREEN")){
         return new Green();
         
      }else if(color.equalsIgnoreCase("BLUE")){
         return new Blue();
      }
      
      return null;
   }
}
第七步

创建一个工厂生成器通过传递的Shape和Color这样的信息来生成工厂。
FactoryProducer.java

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;
   }
}
第八步

使用FactoryProducer来获得AbstractFactory,使它通过传递类型信息来获得具体类生产工厂。

AbstractFactoryPatternDemo.java

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

     //获得shape工厂
      AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");

      //获得一个circle对象
      Shape shape1 = shapeFactory.getShape("CIRCLE");

      //调用circle的draw方法
      shape1.draw();

       //获得一个rectangle对象
      Shape shape2 = shapeFactory.getShape("RECTANGLE");

       //调用rectangle的draw方法
      shape2.draw();
      
     
      Shape shape3 = shapeFactory.getShape("SQUARE");

      
      shape3.draw();

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

      //获得red对象
      Color color1 = colorFactory.getColor("RED");

      //调用red的fill方法
      color1.fill();

     
      Color color2 = colorFactory.getColor("Green");

      
      color2.fill();

     
      Color color3 = colorFactory.getColor("BLUE");

      
      color3.fill();
   }
}
第九步

校验输出。

Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.
Inside Red::fill() method.
Inside Green::fill() method.
Inside Blue::fill() method.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65663.html

相关文章

  • Design Pattern - Factory Pattern

    摘要:原文链接译者个人翻译,水平有限,如有错误欢迎指出,谢谢设计模式工厂模式工厂模式是中最常用的设计模式之一。这种类型的设计模式属于创建型模式下,创建一个对象最好的方式之一。调用圆的方法获得矩形的一个对象并调用它的方法。 原文链接译者:smallclover个人翻译,水平有限,如有错误欢迎指出,谢谢! 设计模式-工厂模式 工厂模式是Java中最常用的设计模式之一。这种类型的设计模式属于创建型...

    zhangwang 评论0 收藏0
  • Design Patterns-Null Object Pattern()

    摘要:实现我们将创建一个抽象类,该类声明了两个方法以及记录客户端名字的属性值。创建具体的类集成该抽象类。第一步创建抽象类第二步创建具体的类继承抽象类第三步创建类第四步使用类通过传递的值来获取或者类的对象第五步校验输出推荐阅读被遗忘的设计模式 原文链接 译者:smallclover Thanks for your watching 设计模式-Null Object Pattern 在Nul...

    浠ラ箍 评论0 收藏0
  • Design Patterns - Bridge Pattern

    摘要:画一个圆使用不同的颜色,相同的抽象类方法,不同的桥的具体实现者。抽象类将持有对象。第四步创建一个具体类实现抽象类。 原文链接译者:smallclover个人翻译,水平有限,如有错误欢迎指出,谢谢! 设计模式-桥模式 我们使用桥来解耦(decouple )一个抽象以及该抽象的实现。使用桥之后抽象和实现可以相互独立的改变。这种类型的设计模式来源于结构型模式,它可以通过使用桥结构来解耦抽象类...

    Tangpj 评论0 收藏0
  • PHP 设计模式概述

    摘要:创建型模式主要有以下五种简单工厂模式和工厂方法模式抽象工厂模式单例模式建造者模式原型模式在设计模式一书中将工厂模式分为两类工厂方法模式与抽象工厂模式。 一、 设计模式(Design pattern)是什么 设计模式是一套被反复使用、多数人知晓、经过分类编目的代码设计的经验总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 二、 为什么会有设计模式 在软件开发过...

    IntMain 评论0 收藏0
  • Design Patterns - Builder Pattern

    摘要:第七步使用来演示生成器模式第八步校验输出译者注注意区分抽象工厂模式和生成器模式的区别生成器模式的是生产一个复杂的产品,抽象工厂模式是生产一个族的产品。具体请参考文章生成器模式与抽象工厂模式的区别。 原文链接译者:smallclover个人翻译,水平有限,如有错误欢迎指出,谢谢! 设计模式-生成器模式 生成器模式使用简单的对象来逐步的构建一个复杂的对象。这种类型的设计模式是创建型模式中创...

    Pikachu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<