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;
    }
    }
  • 相关阅读:
    Linux下配置Tomcat服务器
    Octopress + GitHub Page 搭建个人博客
    Cocoapods报错Unable to satisfy the following requirements
    类方法load和initialize的区别
    AFNetworking3.0 Post JSON数据
    iOS防止button重复点击
    iOS与H5交互遇到的坑
    cocoapods安装
    平时做的一些好玩或者测试的 项目 特效,动画
    webpack那些事儿
  • 原文地址:https://www.cnblogs.com/kkkblog/p/3530812.html
Copyright © 2011-2022 走看看