抽象工厂模式讲解

2024-03-21

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

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

但我无法彻底理解它。我什至浏览了一些例子这个链接 http://www.javatpoint.com/abstract-factory-pattern and 这个问题 https://stackoverflow.com/questions/21706319/understanding-abstract-factory-pattern,但没有任何帮助。

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


这就是抽象工厂模式的流程。它是用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();
   }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

抽象工厂模式讲解 的相关文章

  • 根据请求创建 Hibernate-Session

    我刚刚启动了一个简单的 Java 测试项目 它使用 Hibernate 管理一些实体 并提供 REST 接口来操作这些对象并提供一些额外的业务逻辑 REST 接口是使用 RESTEasy 和 Jetty 创建的 到目前为止 一切工作正常 但
  • 在应用程序中搜索对象的设计模式

    需要一些有关设计模式的帮助 我正在创建一个应用程序 该应用程序在存储在单独表中的数据库中的对象上具有不同类型 例如 我有 5 种对象 A B C D E 我在数据库中有 5 个不同的表来存储每个对象 现在 我想在我的应用程序中实现搜索功能
  • 注册模式和注册对象的延迟实例化

    让我们想象一下我们有注册表模式
  • 是否可以将继承应用于 Singleton 类?

    今天面试时遇到一个问题 是否可以在单例类上应用继承概念 我说过 由于构造函数是私有的 因此我们无法扩展该 Singleton 类 他问我的下一件事是在该 Singleton 类上应用继承 因此 我将单例的构造函数设置为受保护的 认为孩子的构
  • 方法链接的优点和缺点以及用对象本身替换所有 void 返回参数的可能性

    我最感兴趣的是Java 但我认为这是一个普遍的问题 最近我一直在使用 Arquillian 框架 ShrinkWrap 使用了大量的方法链 方法链的其他示例是以下方法StringBuilder StringBuffer 使用这种方法有明显的
  • JavaFX 中 ImageView 的顺序转换

    我已经看过了如何在 javafx 2 1 中等待转换结束 https stackoverflow com questions 11188018 how to wait for a transition to end in javafx 2
  • PHP 设计模式

    好的 我想首先让您注意到我一直在寻找 php mvc 设计模式 所以我还没有真正找到我想要的东西 现在 在写我的问题时 我找不到我要问的任何相关且具体的问题 但我知道我可能是错的 无论如何考虑这个问题和一个可能有用的问题包 Question
  • 横切关注点示例

    什么是一个很好的例子cross cutting concern 医疗记录示例维基百科 http en wikipedia org wiki Cross cutting concern页面对我来说似乎不完整 具体来说 从这个例子来看 为什么日
  • 使用 Doctrine2 时的多重歧视级别

    我正在使用 Doctrine2 来管理我的模型 如下 有一个抽象概念Content与复合模式Gallery 也是一个抽象概念Media从中Video and Image继承 我的选择是添加鉴别器Content and Media表以便区分G
  • 确定方法调用顺序的接口设计模式

    我想创建一个具有多种方法的 Java 接口 但我希望界面的用户只能按照我定义的顺序或顺序调用方法 例如buyTicket 不应在此之前调用reserveTicket 问 有没有设计模式或任何关于如何做到这一点的提示 我考虑过 A 接口被包装
  • 与竞争的消费者顺序处理消息

    Problem 我以特定顺序 FIFO 在队列上接收消息 比如订单 我的队列中有竞争的消费者 为了进一步增加复杂性 消费者可能只对订单的特定版本感兴趣 具体取决于其状态 例如版本 1 版本 2 和版本 5 订单版本号在订单上可用 但不能用于
  • 业务代表与服务定位器

    Business Delegate 和 Service Locator 之间有什么区别 两者都负责封装查找和创建机制 如果 Business Delegate 使用 Service Locator 来隐藏查找和创建机制 那么 Busines
  • MVVM ViewModel 与 MVC ViewModel

    ViewModel 是一个在 MVVM Model View ViewModel 和 ASP NET MVC 的推荐实现中使用的术语 鉴于每种模式都使用相同的术语 研究 ViewModel 可能会令人困惑 MVC ViewModel 和 M
  • 如何简化 ASP.NET MVC 中的全状态交错模式对话框

    我需要在多对多模式对话框中保留状态渐进增强 http en wikipedia org wiki Progressive enhancementASP NET MVC 项目中的方式 在我的代码中 当禁用 javascript 时 模式对话框
  • JavaScript 中的单例模式

    下面是 JavaScript Singleton 模式的一个非常流行的实现示例 var mySingleton function var instance function init function privateMethod conso
  • 在关系数据库中存储树结构的已知方法有哪些? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如果我以后要应用ado实体框架,推荐的数据访问层设计模式是什么?

    我正在创建一个网站并使用 Linq to SQl 作为数据访问层 并且我愿意使该网站可以在 linq to sql 和 ado 实体框架上工作 而无需更改其他层中的许多内容 业务逻辑层或 UI层 实现这一目标的推荐模式是什么 你能简单解释一
  • 为什么抽象类应该实现抽象基类的抽象方法?

    在下面的示例中 该类Derived实现抽象方法method从课堂上Main 但我想不出在抽象中填写方法体的理由Derived类的实现 当然 我应该只在实际类中实现抽象方法 那么我怎样才能避免这样做呢 我还可以做些什么 abstract cl
  • Java 枚举相对于旧的“类型安全枚举”模式的优势?

    在 JDK1 5 之前的 Java 中 Typesafe Enum 模式是实现只能采用有限数量值的类型的常用方法 public class Suit private final String name public static final
  • 如何提高环复杂度?

    对于具有大量决策语句 包括 if while for 语句 的方法 循环复杂度会很高 那么我们该如何改进呢 我正在处理一个大项目 我应该减少 CC gt 10 的方法的 CC 并且有很多方法都存在这个问题 下面我将列出一些例如我遇到的问题的

随机推荐

  • SKLearn Naive Bayes:在 tfidf 矢量化后添加特征

    因此 我的任务是训练一个电话记录模型 以下代码执行此操作 一些背景信息 x 是一个字符串列表 每个第 i 个元素是一个完整的转录本 y 是布尔值列表 表示调用的结果是正还是负 以下代码有效 但这是我的问题 我想将通话时长作为一项训练功能 我
  • 带 ProgressBar 的 Endless RecyclerView 用于分页

    我正在使用一个RecyclerView http developer android com reference android support v7 widget RecyclerView html并以十个为一组从 API 获取对象 对于
  • PHP 未在正确的位置回显

    我在我的 WordPress 网站上运行一些 PHP 代码 当 PHP 运行以回显某些信息时 它没有在正确的位置回显它 代码的缩写版本是 div class description cms div h2 Search By Category
  • 使用 Ruby On Rails 进行事务操作

    我在控制器内有一个复杂的操作 可以对数据库执行多个更新查询 我怎样才能做出这个动作行为类似于交易没有任何结构重构 MyModel transaction do begin model update stuff sub model updat
  • 如何让控件重绘 Windows 窗体?

    我不太确定 重绘 是我正在寻找的 我是手工设计 Windows 窗体的新手 我创建了一个类 它将使用 TableLayoutPanel 作为传递的变量 并在该表格布局面板中进行自己的设计 以便可以重用该控件并调整其参数以适应其包含的数据 我
  • 用于本机 C++ 的 C++/CLI 包装器,可在 C# 中用作参考

    标题解释了 我有本机 C dll 正在为其编写 C CLI 包装器 这些包装器将依次导入到 C 中作为参考 问题是在 C 中我看不到包装器中的类 从 DLL 导入 我应该使用哪些关键字以及如何重新声明我的本机 C 对象以在 C 中可见 好的
  • 角度从 1 开始 ngFor 索引

    ngFor索引是否可以从1而不是0开始 let data of datas let i index 1 没用 ngFor let item of items slice 1 let i index 切片管 https angular io
  • 在 Visual Studio 2015 中使用和导出 std::string 和 std::vector

    使用 VS2013 和合适的导出宏 我可以使用此示例代码导出 std string 和 std vector ifdef MSC VER Explicit template exports c EXPORT TEMPLATE templat
  • Qt 安装程序框架 - 在开始菜单中为所有用户创建快捷方式

    使用安装程序框架 我想为我的应用程序创建一个安装程序 该应用程序由管理员安装在 PC 上 然后该应用程序由不同的用户使用 在安装程序中 我创建从可执行文件到开始菜单的快捷方式 这是在installscript js通过命令 componen
  • Angularjs - 元素上的多个指令,其中一个是隔离范围

    想知道是否有人可以解释当前的行为 我有一个具有隔离范围的指令 称之为 dirA 然后我在上面添加了另一个指令 dirB 期望第二个指令获取isolate指令创建的每个范围 dirB 获取控制器范围 为什么它不能获得 dirA 为该元素创建的
  • Rails - 使用父级的范围父级验证嵌套属性的唯一性

    我在 Rails 中对具有父级的嵌套属性进行范围唯一性验证时遇到问题 背景 我有一个包含 3 个模型的 Rails 4 应用程序 app models account rb class Account lt ActiveRecord Bas
  • 在 C# 中实现这 3 个类的最佳方式:Vector、Direction(单位向量)、Point

    所有点都是向量 所有向量都是点 所有方向都是向量 并非所有向量都是方向 这不应该意味着不允许双向转换 我希望最好将运算符全部覆盖一次 因为它们都是完全相同的 在 C 中 我可以定义 class Vector float x y z 并执行
  • Couchbase 几秒后超时

    我有大约 100 200k 个小文档 其中包含 base64 编码的图像 非常小的图像 我正在尝试将所有这些文档插入 Couchbase 但在前 28k 个文档 总大小约为 185 Mb 后我不断收到此错误 Error Client Sid
  • npm 包上的“at”(@) 前缀是什么意思?

    In the Angular 组件路由器文档 https docs angularjs org guide component router我刚刚偶然发现了一个我以前从未见过的 npm 命令 我不明白发生了什么 npm install an
  • Delphi:如何使用 $OVERFLOWCHECKS OFF 禁用溢出检查?

    我有一些代码会导致下溢 var t1 t2 delta DWORD begin t1 0xffffff00 t2 0x00000037 delta t2 t1 减法本身does生成上溢 下溢 但我不希望 Delphi 抛出EIntOverf
  • 如何从 Slack 获取用户 ID 到机器人服务

    我正在使用 Azure LUIS 创建一个简单的机器人 这是我的第一个机器人 经过一些研究后 我取得了一些不错的进展 现在还与 Slack 集成作为测试它的渠道 机器人功能运行良好 但我希望识别用户的身份 这样我就可以个性化机器人对话 并从
  • Python - 在 Flask 中将查询结果从服务器返回到客户端

    我拥有的 我在 Flask 中有一个客户端 服务器 客户端将 JSON 格式的查询发送到服务器 服务器创建一个 JSON 文件 还有另一个工具可以接受此查询 在数据库上执行它并将结果写入 results txt 文件 服务器定期检查 结果
  • 如何在不隐藏控制框的情况下隐藏 WPF 功能区窗口(启用 Aero)中的标题栏?

    我目前使用 WPF Ribbon Window 并在当前窗口中启用 Aero 如下图所示 我喜欢隐藏标题 模式测试仪 因为没有足够的空间来显示它 但我还是需要原装windows控制盒以及当前标题 即使它会被隐藏 将显示在任务管理器和其他相关
  • for 循环进行多个扩展并对每个文件执行一些操作

    我试图在 bash 中编写一个 for 循环来获取扩展名为 jpg jpeg png 的文件 这是我的尝试 但不起作用 for file in arg jpg jpeg png do echo arg something jpg gt z
  • 抽象工厂模式讲解

    我正在研究设计模式并遇到Abstract Factory Pattern根据定义是 抽象工厂模式说只需定义一个接口或 用于创建相关 或依赖 对象系列的抽象类 但没有指定它们的具体子类 这意味着抽象 工厂让一个类返回类的工厂 但我无法彻底理解