工厂里的那些事

在机房重构的时候工厂层里面的东西都是些没有见过的,所以查了一下资料,总结一下。

System.Reflection(命名空间)

System.Reflection 命名空间包含通过检查托管代码中程序集、模块、成员、参数和其他实体的元数据来检索器相关信息的类型。这些类型还可用于操作加载类型的实例,例如挂钩事件或调用方法。若要动态创建类型,请使用System.Reflection.Emit 命名空间。

CType函数

CType函数作用于两个参数。第一参数是将要转换的表达式,第二个参数是目标类型或对象类。注意,第一个参数必须是表达式,不能是类型。

CType函数是一个内联函数,这意味着转换是由已编译的代码执行的,通常不会生成函数调用,这将提高性能。

语法:

CType(expression,typename)

说明:
expression
任何有效的表达式。如果expression的值超出typename允许的范围,将引发异常。
typename
任何在Dim语句的As子句内合法的表达式,即任何数据类型、对象、结构、类或接口的名称。
CType采用内联方式编译,即转换代码是计算表达式的代码的一部分。在某些情况下不调用过程完成转换,使执行更快。
如果转换不会从expression定义到typename,Visual Basic显示生成时错误消息。

<span style="font-size:18px;">Public Function CreateUserInfo() As IuserinfoDAL
        'CType是一个内联函数,将前部分的表达式转换为后面的类型  
        Return CType(Assembly.Load("LoginDAL").CreateInstance("LoginDAL" & "." & "LoginUserDAL"), IuserinfoDAL)      
    End Function</span>

反射

在.NET Framework中反射

System.Reflection 命名空间中的类与 System.Type 使你能够获取有关加载的程序集和其中定义的类型的信息,如类、接口和值类型。可以使用反射在运行时创建、调用和访问类型实例。有关反射的特定方面的主题,请参见本概述末的相关主题。
公共语言运行时程序管理应用程序域,应用程序域构成具有相同应用程序范围的对象周围定义的边界。此管理包括将每个程序集加载到相应的应用程序域中和控制每个程序集内的类型层次结构的内存布局。
程序集包含模块、模块包含类型,而类型包含成员。反射提供封装程序集、模块和类型的对象。可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性

机房中的发射

在机房重构中我们用到了Assembly,所以这里主要说一下Assembly。
使用Assembly定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。

<span style="font-size:18px;">Public Function CreateUserInfo() As IuserinfoDAL
        'CType是一个内联函数,将前部分的表达式转换为后面的类型  
        Return CType(Assembly.Load("LoginDAL").CreateInstance("LoginDAL" & "." & "LoginUserDAL"), IuserinfoDAL)      
    End Function</span>

Assembly.Load(AssemblyName)这个方法是动态加载程序集,.CreateInstance(className)方法则是创建类的实例

优点:

1、反射提高了程序的灵活性和扩展性

 2、降低耦合性,提高自适应能力

3、它允许程序创建和控制任何类的对象,无需提前硬编码目标类

缺点:

1、性能问题:使用发射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此发射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。

2、使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,发射却绕过了源代码的技术,因而会带来维护的问题,发射代码比相应的直接代码更复杂。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
在 Java 中实现工厂模式通常有三个步骤: 1. 定义接口或抽象类:首先需要定义一个接口或抽象类,它是工厂方法模式中的工厂接口,定义了工厂类的行为。 2. 创建工厂类:创建一个工厂类,实现上面定义的接口或抽象类。工厂类负责创建产品对象,它必须具有选择合适产品的逻辑。 3. 创建产品类:创建产品类并实现接口或抽象类中定义的方法。 以下是一个简单的示例: ``` // 定义产品接口 interface Product { public void print(); } // 创建具体产品类 class ConcreteProductA implements Product { public void print() { System.out.println("This is ConcreteProductA."); } } // 创建具体产品类 class ConcreteProductB implements Product { public void print() { System.out.println("This is ConcreteProductB."); } } // 工厂接口 interface Factory { public Product createProduct(); } // 创建具体工厂类 class ConcreteFactoryA implements Factory { public Product createProduct() { return new ConcreteProductA(); } } // 创建具体工厂类 class ConcreteFactoryB implements Factory { public Product createProduct() { return new ConcreteProductB(); } } // 客户端 public class Client { public static void main(String[] args) { Factory factoryA = new ConcreteFactoryA(); Product productA = factoryA.createProduct(); productA.print(); Factory factoryB = new ConcreteFactoryB(); Product productB = factoryB.createProduct(); productB.print(); } } ``` 在这个示例中,我们定义了一个 `Product` 接口,以及两个具体产品类 `ConcreteProductA` 和 `ConcreteProductB`。然后我们定义了一个 `Factory` 接口,以及两个具体工厂类 `ConcreteFactoryA` 和 `ConcreteFactoryB`。客户端可以通过具体工厂类获得对应的产品对象,并调用其 `print()` 方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值