Java或C#中工厂设计模式的反思

2024-03-02

我偶然发现了一个词,叫做反思。这是工厂设计模式中常用的功能。我很难理解这个概念,因为我仍在学习如何编程。如何在 C# 或 Java 的工厂设计模式中使用反射?谁能给我一个简单的例子,并向我展示您使用反射来实现工厂设计模式的代码?

微软提供了这个反射的代码示例,但我不知道如何在工厂设计模式中使用它。

 // Using GetType to obtain type information: 
  int i = 42;
  System.Type type = i.GetType();
  System.Console.WriteLine(type);

  The Output is: System.Int32

我永远不会使用反射来实现工厂设计模式,除非有特殊情况。下面的代码是实现工厂设计模式的糟糕方法。但既然您想知道“如何”将反射用于工厂设计模式,下面是示例:

namespace NaiveFactory
{

    public interface Shape
    {
        void Draw();
    }

    public class Circle : Shape
    {
        public void Draw() { Console.WriteLine("Drawing Circle"); }
    }

    public class Rectangle : Shape
    {
        public void Draw() { Console.WriteLine("Drawing Rectangle"); }
    }

    public class ShapeFactory
    {
        public static Shape GetShape<T>() where T : Shape
        {
            return Activator.CreateInstance<T>();
        }

        public static Shape GetShape(string shapeName)
        {
            var assembly = Assembly.GetExecutingAssembly();
            var type = assembly.GetType(shapeName).FullName;
            return (Shape) Activator.CreateInstanceFrom(assembly.Location, type).Unwrap();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var shape = ShapeFactory.GetShape<Circle>();
            var shape2 = ShapeFactory.GetShape("NaiveFactory.Rectangle");
            shape.Draw();
            shape2.Draw();
            Console.ReadKey();
        }
    }
}

EDIT根据 @AlexeiLevenkov 的建议,我添加了一些接近依赖注入并实例化的内容Shape使用构造函数注入以及方法的对象:

namespace NaiveFactory
{
    public interface IBoard
    {
        void InternalDraw(string str);
    }

    public class ConsoleBoard : IBoard
    {
        public void InternalDraw(string str) { Console.WriteLine(str); }
    }

    public class DebugBoard : IBoard
    {
        public void InternalDraw(string str) { Debug.WriteLine(str); }
    }

    public interface Shape
    {
        IBoard Board { get; set; }
        void Draw();
        void SetBoard(IBoard board);
    }

    public class Circle : Shape
    {
        public IBoard Board { get; set; }

        public Circle()
        {

        }

        public Circle(IBoard board)
        {
            Board = board;
        }

        public void Draw() { Board.InternalDraw("Drawing Circle"); }

        public void SetBoard(IBoard board)
        {
            Board = board;
        }
    }

    public class Rectangle : Shape
    {
        public IBoard Board { get; set; }

        public Rectangle()
        {

        }

        public Rectangle(IBoard board)
        {
            Board = board;
        }

        public void Draw() { Board.InternalDraw("Drawing Rectangle"); }

        public void SetBoard(IBoard board)
        {
            Board = board;
        }
    }

    public class ShapeFactory
    {
        private static Dictionary<Type, Type> _configurationData = new Dictionary<Type, Type>();

        public static Shape GetShape<T>() where T : Shape
        {
            return Activator.CreateInstance<T>();
        }

        public static void ConfigureContainer<T, U>()
        {
            _configurationData.Add(typeof(T), typeof(U));
        }

        public static Shape GetShape_UsingConstructorInjection(string shapeName)
        {
            var assembly = Assembly.GetExecutingAssembly();
            var type = assembly.GetType(shapeName);
            var constructor = type.GetConstructor(_configurationData.Keys.ToArray());
            if (constructor != null)
            {
                var parameters = constructor.GetParameters();
                return (from parameter in parameters where _configurationData.Keys.Contains(parameter.ParameterType) 
                        select Activator.CreateInstance(_configurationData[parameter.ParameterType]) into boardObj 
                        select (Shape) Activator.CreateInstance(type, boardObj)).FirstOrDefault();
            }
            return null;
        }

        public static Shape GetShape_UsingSetBoardMethod(string shapeName)
        {
            var assembly = Assembly.GetExecutingAssembly();
            var type = assembly.GetType(shapeName);
            var shapeObj = (Shape) Activator.CreateInstance(type);
            if (shapeObj != null)
            {
                shapeObj.SetBoard((IBoard) Activator.CreateInstance(_configurationData[typeof (IBoard)]));
                return shapeObj;
            }

            return null;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            ShapeFactory.ConfigureContainer<IBoard, ConsoleBoard>();
            var shape = ShapeFactory.GetShape_UsingSetBoardMethod("NaiveFactory.Circle");
            var shape2 = ShapeFactory.GetShape_UsingConstructorInjection("NaiveFactory.Rectangle");
            shape.Draw();
            shape2.Draw();
            Console.ReadKey();
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java或C#中工厂设计模式的反思 的相关文章

  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一
  • 如何在 Ivy 中使用不同的分类器下载多个 Maven 依赖项?

    我试图依靠Neo4j 服务器 jar http repo neo4j org content repositories snapshots org neo4j app neo4j server 1 5 SNAPSHOT neo4j serv
  • 防止GDB中的PLT(过程链接表)断点

    在最新版本的 GDB 中 在库函数调用上设置断点会导致多个实际断点 调用过程链接表 PLT 实际的函数调用 这意味着当调用库函数时 我们每次都会经历两次中断 在以前的 GDB 版本中 只会创建 2 因此您只能得到一次中断 那么问题来了 是否
  • 使用antlr4获取预处理器行并解析C代码

    我正在使用 Antlr4 来解析 C 代码 并使用以下语法来解析 链接到 C g4 https github com antlr grammars v4 blob master c C g4 上面的语法默认不提供任何解析规则来获取预处理器语
  • 格式化货币

    在下面的示例中 逗号是小数点分隔符 我有这个 125456 89 我想要这个 125 456 89 其他示例 23456789 89 gt 23 456 789 89 Thanks 看看这个例子 double value 12345 678
  • C#中Enum中定义的value__是什么

    What value 可能在这里 value MSN ICQ YahooChat GoogleTalk 我运行的代码很简单 namespace EnumReflection enum Messengers MSN ICQ YahooChat
  • dropdownlist DataTextField 由属性组成?

    有没有一种方法可以通过 C 使 asp net 中的下拉列表的 datatextfield 属性由对象的多个属性组成 public class MyObject public int Id get set public string Nam
  • 正确使用“extern”关键字

    有一些来源 书籍 在线材料 解释了extern如下 extern int i declaration has extern int i 1 definition specified by the absence of extern 并且有支
  • Android - 保持用户登录状态

    我正在尝试使用 PHP 和 MySQLi for Android 进行登录 我不明白的是如何保持用户登录状态 我看到一个简单的教程 其中有人使用 SQLite 来保护信息 但我不知道这是否真的安全 如何保存用户信息以保持用户登录状态 谢谢
  • 使用(linq to sql)更新错误

    我有两个表 通过外键 CarrierID 绑定 Carrier CarrierID CarrierName CarrierID 1 CarrierName DHL CarrierID 2 CarrierName Fedex Vendor V
  • 为什么 HttpServletRequest 输入流为空?

    我有这段代码 我从请求输入流读取输入并使用 JacksonMapper 转换为 POJO 它在具有 guice 支持的 jetty 7 容器中运行 Override protected void doPost HttpServletRequ
  • Maven `help: effective-pom` 只为单个项目生成,而不是所有项目

    我想为多模块构建中的所有子项目生成有效的 pom The help effective pom文档here http maven apache org plugins maven help plugin usage html The hel
  • 纯虚函数可能没有内联定义。为什么?

    纯虚函数是那些虚函数并且具有纯说明符 0 第 10 4 条第 2 款C 03 的内容告诉我们什么是抽象类 顺便说一句 如下 注意 函数声明不能 同时提供纯说明符和定义 尾注 示例 struct C virtual void f 0 ill
  • 如何将对象转换为传递给函数的类型?

    这不会编译 但我想做的只是将对象转换为传递给函数的 t public void My Func Object input Type t t object ab TypeDescriptor GetConverter t ConvertFro
  • 在 C++ 和 Windows 中使用 XmlRpc

    我需要在 Windows 平台上使用 C 中的 XmlRpc 尽管我的朋友向我保证 XmlRpc 是一种 广泛可用的标准技术 但可用的库并不多 事实上 我只找到一个库可以在 Windows 上执行此操作 另外一个库声称 您必须做很多工作才能
  • g++ C++0x 枚举类编译器警告

    我一直在将可怕的 C 类型安全伪枚举重构为新的 C 0x 类型安全枚举 因为它们是way更具可读性 不管怎样 我在导出的类中使用它们 所以我明确地将它们标记为导出 enum class attribute visibility defaul
  • 按字母顺序对对象的 ArrayList 进行排序

    我必须创建一个方法来排序数组列表根据电子邮件按字母顺序排列对象 然后打印排序后的数组 我在排序时遇到麻烦的部分 我已经研究过并尝试使用Collections sort vehiclearray 但这对我不起作用 我是因为我需要一个叫做比较器
  • c# 模拟 IFormFile CopyToAsync() 方法

    我正在对一个异步函数进行单元测试 该函数将 IFormFile 列表转换为我自己的任意数据库文件类列表 将文件数据转换为字节数组的方法是 internal async Task
  • 在Java的System.out中以表格格式输出

    我正在从数据库获取结果 并希望将数据作为 Java 标准输出中的表输出 我尝试过使用 t 但我想要的第一列的长度变化很大 有没有办法将其显示在类似输出的漂亮表格中 Use System out format http java sun co
  • FindAsync 很慢,但是延迟加载很快

    在我的代码中 我曾经使用加载相关实体await FindAsync 希望我能更好地遵守 C 异步指南 var activeTemplate await exec DbContext FormTemplates FindAsync exec

随机推荐

  • java.lang.OutOfMemoryError:将 13k .png 图像拼接在一起时的 Java 堆空间

    我有 13255 张图像 每张图像宽度为 240 x 240 像素 最大大小为 15 412 字节 最小大小为 839 字节 我试图循环遍历文件夹 将它们添加到 File 中 一旦我有了每个图像的数组 我就将它们放入 BufferedIma
  • 高效使用 Visual Studio diff 编辑器

    我正在使用 Visual Studio 2015 并且有一个使用 Git 在本地进行版本控制的项目 当我双击 团队资源管理器 窗口中的文件时 将打开一个 Diff 编辑器 在其他 IDE Eclipse IntelliJ 中 我习惯于在这些
  • 如何在svn中将文件夹切换到符号链接

    我有一个文件夹 它是 svn 中一个项目的一部分 已被移动到另一个文件夹 存储库以在项目之间共享 我想用符号链接替换 svn 中的这个目录 但是当我尝试这样做时 我收到以下消息 svn Entry project wwwdocs js ha
  • 负载测试时如何测量CPU和内存

    我们在异构环境中使用 JMeter 并且希望在运行服务或 Web 应用程序的服务器上产生重负载时测量 CPU 和内存 您建议使用什么 是否有任何软件解决方案 开源或商业 可以将 CPU 和内存使用情况记录在文件或数据库中 谢谢你 您可以使用
  • 将其他实体添加到实体框架支持的域服务

    我们正在研究使用 RIA 服务 7 月 9 日预览版 来公开现有 EF 模型的部分内容 我们已向 Web 应用程序添加了一个域服务类 并指定了要使用的 EF 模型 并选择了一些我们希望通过域服务提供的实体 有些已启用编辑 大多数没有 我们构
  • 为散点图中的每个点绘制词云

    我创建了一个根据以下数据定义的散点图 请注意 当前仅使用前两个字段进行绘图 var data 5 3 text word1 size 4 text word2 size 1 3 5 text word3 size 5 text word4
  • 解码 NSString 中的 Base-64 编码 PNG

    我有一些NSData它是 Base 64 编码的 我想解码它 我看到了一个如下所示的示例 NSData myPNGData xmlString dataUsingEncoding NSUTF8StringEncoding Base64 in
  • 如何使用 django 重定向功能传递上下文数据?

    我有重定向到 URL 的函数 return redirect orders The URL orders有一些正在传递给它的上下文数据 我想传递一些额外的数据以及来自 URL 函数的数据 如下所示 return redirect order
  • 如何按基数方向自由遍历二维数组中的元素? (下、上、左、右)

    这个问题 https stackoverflow com q 22239871 2736496是关于计算穿过迷宫的路径 由二维数组表示 例如 穿过这个迷宫的路径 0 1 2 3 4 0 1 0 1 1 1 1 1 0 0 0 1 2 1 0
  • Postgres用户创建数据库

    我无法使用我的 postgres 客户端和我登录的用户创建数据库 我无法弄清楚如何增加用户的权限 我可以访问运行 postgres 的 Linux 服务器 并且能够使用 psql 以我的用户和 postgres 用户身份登录 有人可以告诉我
  • 为什么我使用 =(单个等于)的相等比较在 Java 中不能正常工作?

    我在以下行中遇到语法错误 但是我不明白这个错误的原因是什么 if address1 compareTo address2 1 System out println address1 is greater than address2 我想要实
  • iOS 7.1 问题 - 当触摸并拖动该选项卡按钮时,选项卡栏图标图像会自动调整大小

    我有这个代码 tabBarItem1 setFinishedSelectedImage UIImage imageNamed tab pressed home icon withFinishedUnselectedImage UIImage
  • 为什么 Android Studio 不会在发布模式下创建我的 AAR 文件

    使用 Android Studio 我有一个 Android 库项目 它在调试模式下生成 library build outputs aar MyLIB aar 但在发布模式下则不然 我没有看到任何错误 只是 构建成功 在 Gradle C
  • 在 Swift 中显示 GoogleMaps?

    我的代码 var camera GMSCameraPosition cameraWithLatitude currentLocation latitude longitude currentLocation longitude zoom 1
  • dir() 非常慢

    当文件较多时 4000个左右 dir 功能非常慢 我的猜测是它创建了一个结构并以低效的方式填充值 是否有任何快速而优雅的替代方法可以使用dir 更新 使用 MATLAB R2011a 在 64 位 Windows 7 中进行测试 更新 2
  • 如何将天蓝色磁盘恢复到以前的快照?

    我在天蓝色中有一个虚拟机 并通过门户选择了它的磁盘 并创建了它的快照 我现在如何恢复到磁盘快照 通过门户或 CLI 我不想从快照创建新磁盘或虚拟机 只是恢复回来 我现在如何恢复到磁盘的快照 通过门户或 命令行界面 您的意思是您想使用此快照来
  • 如何在 VScode 笔记本中激活跨单元格的单词突出显示?

    我在 Visual Studio Code 1 67 0 中使用 Jupyter ipynb 笔记本 当我双击某个单词 区域时 会突出显示该单词 区域的所有出现位置仅在同一个单元格中 对此的设置在settings json file is
  • Javadoc 在 Eclipse 中不可用

    我正在使用面向 Java 开发人员的 Eclipse IDE 版本 Helios 服务版本 2 内部版本号 20110218 0911 我有一个类似的问题堆栈溢出问题 https stackoverflow com questions 69
  • .data 在 pytorch 中还有用吗?

    我是 pytorch 的新手 我读了很多大量使用张量的 pytorch 代码 data成员 但我搜索 data在官方文档和Google中 发现很少 我猜 data包含张量中的数据 但我不知道什么时候需要它 什么时候不需要 data是一个属性
  • Java或C#中工厂设计模式的反思

    我偶然发现了一个词 叫做反思 这是工厂设计模式中常用的功能 我很难理解这个概念 因为我仍在学习如何编程 如何在 C 或 Java 的工厂设计模式中使用反射 谁能给我一个简单的例子 并向我展示您使用反射来实现工厂设计模式的代码 微软提供了这个