如何合理创建c#对象

创建对象:
通常情况下,人们都不是太重视对象的创建,而是更重视类的设计,但是创建对象确实又很重要。当前比较流行的方法是:工厂创建模式
工厂创建模式中的“工厂”就像真正的工厂,只是创建对象,而且,即使工厂实现有所改变,客户也不会受到影响。
工厂设计模式有两种办法:
1.单工厂模式 ///(这里不好画图,不知道我下面写的能不能正确显示)
Client1                          product1
             Factory             product2
Client2                          product3
客户端需要的是product,他们不需要了解product类是如何建立的,只需要给工厂提供一定的信息,然后创建product对象,看个例子:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication3
{
    public interface IApparel  //定义一个产品接口
    {
        string ShowMe();
        bool Knit
        {
            get;
        }
    }
    public class SportsShirt : IApparel  //产品1(通过接口继承而来)
    {
        public string ShowMe()
        {
            return ("Sports Shirt");
        }
        public bool Knit
        {
            get
            {
                return true;
            }
        }
    }
    public class DressShirt : IApparel  //产品2
    {
        public string ShowMe()
        {
            return ("Dress Shirt");
        }
        public bool Knit
        {
            get
            {
                return false;
            }
        }
    }
    public class ApparelFactory  //创建工厂类
    {
        public IApparel CreateApparel(string apptype)  //定义一个返回对象的方法,该方法返回类型为IApparel,这样任何实现了IApparel接口的类的对象都可以返回。
        {
            switch (apptype)
            {
                case"MDRSHIRT":
                    return new DressShirt();
                case"MSPSHIRT":
                    return new SportsShirt();
            }
            return null;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            ApparelFactory factory = new ApparelFactory();

            IApparel ob1 = factory.CreateApparel("MDRSHIRT");
            IApparel ob2 = factory.CreateApparel("MSPSHIRT");
         
            Console.WriteLine(ob1.ShowMe());
            Console.WriteLine(ob1.Knit);

            Console.WriteLine(ob2.ShowMe());
            Console.WriteLine(ob2.Knit);

            System.Threading.Thread.Sleep(100000);

        }
    }
}

2.多工厂模式
Client1     Factory1   product1
Client2     Factory2   product2
Client3     Factory3 product3
对于简单的例子,用第一种方法比较好点,不过有时用多工厂更合适,比如可能有一个分布式应用。
下面的例子创建一个多工厂模式:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication3
{
    public interface IApparel  //定义一个产品接口
    {
        string ShowMe();
        bool Knit
        {
            get;
        }
    }
    public class SportsShirt : IApparel  //产品1(通过接口继承而来)
    {
        public string ShowMe()
        {
            return ("Sports Shirt");
        }
        public bool Knit
        {
            get
            {
                return true;
            }
        }
    }
    public class DressShirt : IApparel  //产品2
    {
        public string ShowMe()
        {
            return ("Dress Shirt");
        }
        public bool Knit
        {
            get
            {
                return false;
            }
        }
    }


    public abstract class AppFactory   //创建工厂抽象类
    {
        public abstract IApparel CreateApparel();  //创建生产产品抽象类
    }
    public class DressShirtFactory : AppFactory  //Dress工厂
    {
        public override IApparel CreateApparel()
        {
            //throw new Exception("The method or operation is not implemented.");
            return new DressShirt();
        }
    }
    public class SportsShirtFactory : AppFactory  //Sports工厂
    {
        public override IApparel CreateApparel()
        {
            //throw new Exception("The method or operation is not implemented.");
            return new SportsShirt();
        }
    }
    public class ApparelCollector   //创建一个工厂和客户之间的中间人
    {
        public IApparel CollectApparel(AppFactory factory)
        {
            return factory.CreateApparel();
        }
    }
        
  
    class Program
    {
        static void Main(string[] args)
        {
            AppFactory factory = new DressShirtFactory();
            IApparel ob1 = new ApparelCollector().CollectApparel(factory);
            Console.WriteLine(ob1.ShowMe());
            Console.WriteLine(ob1.Knit);

            AppFactory factory1 = new SportsShirtFactory();
            IApparel ob2 = new ApparelCollector().CollectApparel(factory1);
            Console.WriteLine(ob2.ShowMe());
            Console.WriteLine(ob2.Knit);

            System.Threading.Thread.Sleep(100000);

        }
    }
}

38、C 类与对象的深入解析 本文深入解析了 C# 中的类与对象,涵盖了程序集和类的访问修饰符、实例变量和方法的创建、对象的实例化与传递、以及属性的定义与使用。文章还介绍了面向对象编程中数据封装和信息隐藏的重要性,并通过示例代码详细展示了如何构建一个完整的类及其功能。这些内容为开发安全、可维护的 C# 应用程序奠定了基础。 阅读详情

相关推荐

10倍性能飞跃:C#软件性能工程的7个致命陷阱与破局之道

性能测试不是"随便跑个程序",而是要测出真问题。 正确做法:使用BenchmarkDotNet进行专业性能测试 二、GC:性能的"隐形杀手" GC(垃圾回收)是C#应用性能的头号敌人。 正确做法:减少对象分配 三、多线程:不是越多越好 多线程不是越多越好,而是要"恰到好处"。 正确做法:使用线程池控制并发数 四、缓存:让数据"飞"起来 缓存不是"随便加个MemoryCache"就行,而是要"精准打击"。 正确做法:精准缓存,避免内存爆炸 五、数据结构:选择比优化更重要 数据结构选对了

java专栏 584

C#中创建对象的几种方式

创建对象的几种方式

leikang111的博客 8590

Flink项目基础配置指南

在大数据处理领域,Apache Flink凭借强大的实时流处理和批处理能力,成为众多开发者的首选工具。在日常工作中,开发Flink Jar任务是常见需求,但每次都需重复配置日志、梳理pom依赖、设置打包插件等,流程繁琐且易出错。为提升开发效率,减少重复劳动,将这些基础配置进行整理归纳十分必要。本文将围绕Flink项目的本地日志配置、pom依赖及插件配置展开详细介绍,为开发者提供一套可直接复用的基础配置方案,助力Flink项目高效开发。在Flink项目中,日志是了解任务运行状态、排查问题的重要依据。本地日志配

qq_42773076的博客 1210

创建对象的四种方式

1.字面量创建对象 let person ={ name: “Andy”, age: 18, say: function(){ console. log(" hello!") } } 2.构造函数创建对象 function Person( name, age){ this.name =name, this. age = age, this. say = function(){ console. log(" hello") } } this指向构造函数创建的实例对象 let student = new Per

tanqin的博客 1761

Android 11系统定制:如何彻底隐藏状态栏电池图标(RK3568实测)

本文详细解析了在Android 11系统上如何通过多维度修改实现状态栏电池图标的彻底隐藏,特别针对RK3568平台提供了实战指南。从系统UI架构解析到核心配置文件修改,再到进阶技巧与疑难排查,帮助开发者深度定制Android系统,满足特定场景需求。

weixin_29250573的博客 376

EduCoder 计算机网络实验 IP协议分析

第1关:跟踪抓包 任务描述 相关知识 IPV4数据包 截获数据报 分析截获结果 使用git将本地文件推送到远程仓库永久保存 操作要求 任务描述 本关任务:使用 Ping 命令发送数据报,用 Wireshark 截获数据报,分析 IP 数据报的格式,理解 IPV4 地址的编址方法,加深对 IP 协议的理解。 相关知识 为了完成本关任务,你需要掌握: 截获数据报; 简单分析数据包格式。 IPV4数据包 网际协议第 4 版(Internet Protocol version 4

qq_41975868的博客 1万+

C#创建对象的5种方式

new()创建 Activator创建 Reflection创建 XmlSerializer创建 MemberwiseClone创建 Student类 [XmlRootAttribute("PurchaseOrder", Namespace = "http://www.cpandl.com", IsNullable = false)] public class Student { public override string ToString() { return

maofengwoaini的博客 7853

原神真端,原神服务端,虚拟机启动部署傻瓜式教学

没玩过抽卡 游戏想体验一下抽卡的感觉,听说原神有真端了,所以弄一个局域网的服务体验一下,这里要感谢一些服务端的分享者。

azyouyouyou的博客 1万+

C#对象的创建和使用

在C#中,对象是根据类定义创建的实体,它包含了数据(属性)和可以对这些数据进行操作的功能(方法)。创建对象通常涉及到使用关键字,它会在内存中分配空间并初始化对象。new创建对象在这个例子中,是类名,是对象的引用,是调用类的构造函数来创建对象的表达式,和是传递给构造函数的参数,分别代表名字和年龄。

qq_60276822的博客 1667

光伏发电预测(LSTM、CNN_LSTM和XGBoost回归模型,Python代码)

一旦结果与预测差距较大,可能存在光伏系统的问题,需要找出原因,然后采取适当措施来修复光伏系统并做出更好的决策。例如,根据准确的预测,光伏系统运营商可以平衡电力消耗,并将多余的电力储备用于紧急情况。然而,光伏系统的发电量估算是一个挑战,因为光伏系统的发电量受到天气条件的极大影响。整个项目文件夹(第一个文件夹为xgboost模型相关的包文件,xg.py是xgboost模型英文注释版本,xg_chinese.py是xgboost模型中文注释版本)表示空气的温度,通常以摄氏度(°C)或华氏度(°F)为单位。

2301_79699110的博客 3032

Python和Spyder:一个完美的编程组合

而Spyder作为一个专门为科学计算和数据分析而设计的IDE,提供了高效的开发环境和丰富的工具。无论是初学者还是专业开发者,Python和Spyder都能满足他们的需求,并为他们的工作带来便利和效率。本文将探讨Python和Spyder之间的关系,以及它们如何相互配合,提供一流的编程体验。每个工具都有其特定的优势和适用场景,开发者可以根据自己的需求选择合适的工具。而Spyder作为一个专门为科学计算而设计的IDE,提供了编写、调试和执行Python代码的环境。

CodeHeroicX的博客 1123

C#中new一个对象的过程说明

在代码中我们经常能看到下面这样的语句。 A a = new A();(1) B b = null;(2) C c;(3) 代码(1) 创建A的对象并对其进行初始化。 A:类; new A():创建A的对象并对其初始化; a:引用,指向new A()这个对象的引用。 注意:a不是A的对象,new A()才是A的对象。   代码(2) 声明引用b,并指向null。 B:类; b

三五月儿的专栏 1万+

【光子 AI】AI Agent 知识体系深度研究报告

从理论基础到前沿应用:全面解析人工智能代理的核心架构、关键技术与发展趋势📅 2026 年 3 月 | 📊 深度研究报告 | 🔬 人工智能领域 | 📈 前沿技术分析**AI Agent(人工智能代理)**是一种能够感知环境、基于所获得的信息做出决策,并执行行动以影响该环境的软件系统。AI Agent 的设计旨在模仿或实现智能行为,它们可以在各种环境中操作,包括物理世界和虚拟空间。随着大语言模型(LLM)技术的突破性进展,AI Agent 正从实验室研究快速走向产业应用。根据 Gartner 发布的《2

AI天才研究院 176

C# 中异步任务(`Task`)和对象生命周期管理,具体是关于 `PcZth` 类的实例化、内存管理以及多次创建实例是否合理的问题

多次new PcZth是否合理合理,如果任务需要独立的PcZth实例来隔离状态。不合理,如果PcZth的创建成本高或任务频率过高,可能导致性能问题。销毁时机PcZth实例在任务结束且无引用时由 GC 回收。如果涉及资源管理,需显式调用Dispose()。内存压力:取决于PcZth的内存占用和任务频率。建议通过性能分析工具确认是否存在问题。优化建议如果PcZth可以共享,考虑单例模式。如果创建成本高,考虑对象池模式。如果涉及资源管理,实现并显式清理。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 831

用Excel或WPS做两独立样本的T检验

一般情况下收集数据时常用的是Excel或者WPS,但统计时却用SPSS等软件进行统计学分析,经常很多人找不到SPSS的安装包,或者苦于正版激活或忘记教程,其实Excel或WPS自带函数就足够了,均数、标准差以及统计检验都是一个函数而已。解释:先做F检验,如果F>0.05就做T检验,Ttset里的数据为两组的数据的比较,结果如下。A组的均数计算 =AVERAGE(B2:B6)A组的标准差计算 =STDEV(B2:B6)B组的标准差计算=STDEV(B7:B19)分组 数值 A组均数 A组标准差 p值。

Mrrunsen的博客 6752

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C#之垃圾回收

垃圾回收时现代语言的标志之一。垃圾回收解放了手工管理对象释放的工作,提高了程序的健壮性,但是副作用就是程序代码可以对于创建对象变得随意。 1、避免不必要的对象创建 由于垃圾回收的代价较高,所以C#程序开发要遵循的一个基本原则就是避免不必要的对象创建。以下列举一些常见的情型。 a)、避免循环创建对象 如果对象并不会随每次循环改变而改变状态,那么在循环中反复创建对象将带来...

weixin_30617797的博客 80

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C# 面向对象2 (类的语法)

1.类 语法: [public] class 类名 { 字段; 属性; 方法; } **类名首字母必须大写 2.创建对象 创建这个类的对象过程称之为类的实例化,关键字:new this:表示当前这个类的对象. 类是不占内存的,而对象是占内存的!(因为创建完对象后,对象的字段就会被初始化,有了初始值) 创建一个Person类:创建了字段(存取数据)和...

weixin_34418883的博客 150

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C# 构造方法详解:定义、使用与重载

在C#中,构造方法(也称为构造函数)是一种特殊的方法,它用于在创建对象时初始化该对象。每个类都可以有一个或多个构造方法,但不允许有返回类型(包括void)。构造方法的名称必须与类名完全相同,且大小写也要一致。

学习和分享 1064

C#学习第28天:内存缓存和对象池化

C#针对内存优化的两种方式,缓存和对象池。

ghost143的博客 836

C#编程,一些性能优化方面的总结

C#性能优化

君一席 928

深入理解C#实例构造函数:对象初始化的关键

确保对象在创建时处于有效状态提供多种初始化对象的方式控制对象的创建过程理解构造函数的工作原理对于编写健壮的面向对象代码至关重要。在实际开发中,应根据类的需求设计适当的构造函数,使对象的使用更加直观和安全。希望这篇文章能帮助你更好地理解和使用C#构造函数!如果你有任何问题或想法,欢迎在评论区留言讨论。

钢铁男儿 669

《软件开发性能优化系列》之C#语言垃圾回收

  《软件开发性能优化系列》目录           垃圾回收时现代语言的标志之一。垃圾回收解放了手工管理对象释放的工作,提高了程序的健壮性,但是副作用就是程序代码可以对于创建对象变得随意。 1、避免不必要的对象创建      由于垃圾回收的代价较高,所以C#程序开发要遵循的一个基本原则就是避免不必要的对象创建。以下列举一些常见的情型。 a)、避免循环创建对象       如果对象

479

Unity C#入门:数组与列表List的创建与使用

本文介绍了Unity中数组和列表(List)的核心概念与使用方法。主要内容包括: 基本概念:数组是固定大小的数据结构,列表是动态大小的集合类型 创建方式: 数组:int[] numbers = new int[5]; 列表:List<int> numbers = new List<int>(); 核心操作: 添加元素:list.Add(item) 访问元素:array[index] 遍历集合:使用for/foreach循环 应用场景: 游戏对象管理 资源加载 数据

输出倒逼输入,写作驱动成长。 1万+

Type-C扩展坞EMC整改:从辐射频谱图到源头路径天线全解析

电磁兼容性是消费电子设计中绕不开的工程难题,辐射发射超标尤为常见。测试中得到的频谱图并非只是超标判定依据,更蕴含噪声源头、传播路径与天线结构的深层信息。以Type-C扩展坞为例,高速数字信号翻转产生的高频电流、PCB回流参考面缺口以及线缆共模辐射,构成了一条完整的EMC问题链路。通过分析30MHz-1GHz频段的频谱形态,结合开展频、电源滤波、共模扼流圈、接地重整与线缆屏蔽等整改手段,可以系统性地将辐射余量控制在限值内。这套从频谱图反推问题、按源头-路径-天线顺序落地的思路,适用于多接口小尺寸产品的工程实践

weixin_30247781的博客 229

C#程序性能优化

http://blog.youkuaiyun.com/scalzdp/article/details/34421639 程序中我们每一丝动作都会加大程序运行的负担,当刚开始学习程序的时候常常不会去考虑程序运行的效率,大多数情况是为了实现功能,只要功能达到我想要的那么就算是达成了此项目标。当大部分功能的编码实现对我们来说都不是大的问题的时候,我们要提升就要考虑怎样把程序写的更加规范更加高效。怎样写的高效...

weixin_34292924的博客 380
上一篇: .Net技术开发中两个“属性”引起的歧异
下一篇: C#抽象工厂模式的几种实现方法及比较
EasyFRMS
博客等级 码龄18年 5粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值