zoukankan      html  css  js  c++  java
  • 工厂模式以及反射机制

    Public interface IFruit{
    }

    接下来我们为抽象的水果(接口)提供具体的水果类:

    public class Orange:IFruit{
    public Orange(){
    Console.WriteLine(
    "An orange is got!");
    }
    }

    public class Apple:IFruit{
    public Apple(){
    Console.WriteLine(
    "An apple is got!"); 
    }
    }


    最后我们再创建一个水果工厂:

    public class FruitFactory{
    public IFruit MakeFruit(string Name){
    switch (Name){
    case "Orange":
    return new Orange();
    case "Apple":
    return new Apple();
    default:
    return null;
    }
    }
    }


    在水果工厂(FruitFactory)中,只要输入一个水果名称(Name),就会返回一个相应的水果对象:

    string FruitName = Console.ReadLine();
    IFruit MyFruit;
    FruitFactory MyFruitFactory 
    = new FruitFactory();
    MyFruit 
    = MyFruitFactory.MakeFruit(FruitName);

    以上水果工厂(FruitFactory)的工作原理就是,根据输入的水果名称,经过条件判断(switch),返回相应的水果对象。

    如果水果工厂(FruitFactory)只要知道水果的名称(Name),而无须经过条件判断(switch),就能返回相应的水果对象,那就好了。

    在C#中提供了相应的机制,那就是反射。

    在反射机制中一个重要的类就是System.Type类,我们可以使用 Type 对象的方法、字段、属性和嵌套类来查找类的所有信息。

    另外一个重要的类就是System.Activator,它包含特定的方法,可以在本地创建对象或创建现有远程对象的引用。

    我们可以先利用Type类获取Name指定的类名的类的Type信息,然后可以根据这个信息利用Activator创建对象。

    public class FruitFactory{
    public IFruit MakeFruit(string Name){
    IFruit MyFruit 
    = null;
    try{
    Type type 
    = Type.GetType(Name,true);
    MyFruit 
    = (IFruit)Activator.CreateInstance(type);
    }
    catch (TypeLoadException e)
    Console.WriteLine(
    "I dont know this kind of fruit,exception caught - {0}" ,e.Message);
    return MyFruit;
    }
    }
  • 相关阅读:
    大型网站核心架构因素
    大型网站架构模式
    博客中的文章归档是如何实现的
    Caused by: java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
    git分支开发的好处
    layui之日期和时间组件
    vue-electron脚手架
    springboot1.5.4 配置druid1.1.0(使用druid-spring-boot-starter)
    Node.js读取文件内容并返回值(非异步)
    C# ftp ListFilesOnServer
  • 原文地址:https://www.cnblogs.com/kkkblog/p/3530812.html
Copyright © 2011-2022 走看看