设计模式之C#简单工厂模式
c课程设计设计模式

c 课程设计设计模式一、教学目标本课程旨在让学生掌握设计模式的基本概念、原则和常见的设计模式,培养学生运用设计模式解决实际问题的能力。
通过本课程的学习,学生将能够:1.理解设计模式的基本概念、原则和分类;2.熟悉常见的设计模式及其应用场景;3.能够运用设计模式解决实际问题,提高代码的可维护性和可扩展性。
二、教学内容本课程的教学内容主要包括设计模式的基本概念、原则、常见的设计模式及其应用。
具体安排如下:1.设计模式的基本概念:介绍设计模式的定义、目的和分类;2.设计模式的原则:讲解设计模式遵循的原则,如SOLID原则;3.常见的设计模式:介绍常见的设计模式,如单例模式、工厂模式、观察者模式等,并分析其应用场景;4.设计模式的运用:通过实际案例,讲解如何运用设计模式解决实际问题。
三、教学方法为了提高学生的学习兴趣和主动性,本课程将采用多种教学方法,如讲授法、讨论法、案例分析法等。
具体如下:1.讲授法:讲解设计模式的基本概念、原则和常见的设计模式;2.讨论法:学生分组讨论设计模式的优缺点及应用场景;3.案例分析法:分析实际案例,引导学生学会运用设计模式解决实际问题。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:选用权威、实用的设计模式教材;2.参考书:提供设计模式相关的参考书籍,以便学生课后深入研究;3.多媒体资料:制作精美的PPT,便于学生理解和记忆;4.实验设备:提供计算机实验室,便于学生实践和实验。
五、教学评估本课程的教学评估将采用多元化的评价方式,包括平时表现、作业、考试等,以全面、客观、公正地评估学生的学习成果。
具体评估方式如下:1.平时表现:通过课堂参与、提问、小组讨论等环节,评价学生的学习态度和课堂表现;2.作业:布置适量的课后作业,检查学生对知识点的理解和应用能力;3.考试:设置期中考试和期末考试,以检验学生对本课程知识的掌握程度。
C设计模式大全

C#设计模式(1) ...................................................................... 错误!未定义书签。
一、 C# 面向对象程序设计复习....................................... 错误!未定义书签。
二、设计模式举例 ............................................................... 错误!未定义书签。
三、先有鸡还是先有蛋?................................................... 错误!未定义书签。
四、大瓶子套小瓶子还是小瓶子套大瓶子?................... 错误!未定义书签。
五、本质 ............................................................................... 错误!未定义书签。
C#设计模式(2) ...................................................................... 错误!未定义书签。
一、"开放-封闭"原则(OCP) ........................................ 错误!未定义书签。
二、里氏代换原则(LSP).............................................. 错误!未定义书签。
C#设计模式(3) ...................................................................... 错误!未定义书签。
三、依赖倒置原则(DIP) .................................................. 错误!未定义书签。
C 设计模式整理

C#设计模式学习笔记概述 (2)创建型模式 (2)Abstract Factory Method (2)Builder (6)Factory Method (9)Singleton (13)Prototype (15)结构型模式 (17)Adapter (17)Bridge (20)Composite (23)Decorator (28)Facade (31)Flyweight (34)Proxy (37)行为型模式 (40)Chain Of Responsibility (40)Command (44)Interperter (47)Iterator (50)Mediator (54)Memento (57)Template Method (60)State (63)Strategy (67)Visitor (69)Observer (72)总结 (76)设计模式的点滴 (76)概述设计模式(Design Pattern)使人们可以更加简单方便地复用成功的设计和体系结构。
将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。
Gof中,把设计模式分为3大类共23种。
参考资料:✧Microsoft Webcast :/china/msdn/events/webcasts/shared/webcast/ consyscourse/CsharpOOD.aspx✧网上一份23中模式的C# code✧《C#设计模式》创建型模式创建型(Creational)模式:负责对象创建Abstract Factory Method✓名称:Abstract Factory Method,抽象工厂模式(创建型模式)✓问题(动机-Motivation):✧在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。
✧如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?✓意图(Intent):✧提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。
C语言设计模式

目录1.C语言设计模式(开篇) (2)2.C语言和设计模式(继承、封装、多态) (3)2.1继承性 (3)2.2封装性 (4)2.3多态 (4)3.单件模式 (4)4.工厂模式 (5)5.抽象工厂模式 (6)6.访问者模式 (8)7.状态模式 (9)8.命令模式 (9)9.解释器模式 (10)10.备忘录模式 (11)11.观察者模式 (12)12.桥接模式 (12)13.建造者模式 (13)14.中介者模式 (14)15.策略模式 (15)16.适配器模式 (16)17.装饰模式 (17)18.亨元模式 (17)19.代理模式 (18)20.外观模式 (19)21.迭代器模式 (20)22.责任链模式 (21)23.模版模式 (22)24.组合模式 (24)25.原型模式 (25)1.C语言设计模式(开篇)关于软件设计方面的书很多,比如《重构》,比如《设计模式》。
至于软件开发方式,那就更多了,什么极限编程、精益方法、敏捷方法。
随着时间的推移,很多的方法又会被重新提出来。
其实,就我个人看来,不管什么方法都离不开人。
一个人写不出二叉树,你怎么让他写?敏捷吗?你写一行,我写一行。
还是迭代?写三行,删掉两行,再写三行。
项目的成功是偶然的,但是项目的失败却有很多原因,管理混乱、需求混乱、设计低劣、代码质量差、测试不到位等等。
就软件企业而言,没有比优秀的文化和出色的企业人才更重要的了。
从软件设计层面来说,一般来说主要包括三个方面:(1)软件的设计受众,是小孩子、老人、女性,还是专业人士等等;(2)软件的基本设计原则,以人为本、模块分离、层次清晰、简约至上、适用为先、抽象基本业务等等;(3)软件编写模式,比如装饰模式、责任链、单件模式等等。
从某种意义上说,设计思想构成了软件的主题。
软件原则是我们在开发中的必须遵循的准绳。
软件编写模式是开发过程中的重要经验总结。
灵活运用设计模式,一方面利于我们编写高质量的代码,另一方面也方便我们对代码进行维护。
设计模式简答题.

1.什么是设计模式?设计模式的目标是什么?答:设计模式通常是对于某一类的软件设计问题的可重用的解决方案,将设计模式引入软件设计和开发过程,其目的就在于要充分利用已有的软件开发经验。
2.设计模式具有哪三大特点?答:(1) 在特定的场景下有可重用性,对相同类型不同问题的环境,其解决方案都有效。
(2) 可传授性,即问题出现的机会很多,解决问题的方案相同,人们相对可以接受。
(3) 有表示模式的名称。
3.GOF 设计模式常用的有几种?GOF 设计模式按照模式的目的可分为哪三类?答:行为型,结构型,创建型4.画出抽象工厂方法类图(这类题自己看书去。
)5.针对接口编程,不针对实现编程的意义。
答:主题与观察者都是用接口:观察者利用主题的接口向主题注册,而主题利用观察者接口通知观察者。
这样可以让两者之间运作正常,又同时具有松耦合的优点。
6.面向对象(OO)的原则有:答:1.封装变化2.多用组合,少用继承3.针对接口编程,不针对实现编程4.为交互对象之间的松耦合设计而努力5.对扩展开放,对修改关闭6.依赖抽象,不要依赖具体类7.只和朋友交谈8.别找我,我会找你9.类应该只有一个改变的理由7. 耦合分为几种?(1)内容耦合(2)公共耦合(3)外部耦合(4)控制耦合(5)标记耦合(6)数据耦合(7)非直接耦合8.GOF模式分为几种,每种包含哪些模式?答:分为3种。
创建型设计模式:简单工厂模式,工厂方法模式,抽象工厂模式,建造者模式,原型模式,单例模式;结构型设计模式:适配器模式,桥接模式,组合模式,装饰模式,外观模式,轻量级模式,代理模式;行为性设计模式:责任链模式,命令模式,解释器模式,迭代器模式,中介者模式,备忘录模式,观察者模式,状态模式,策略者模式,模板方法模式,访问者模式。
1.不要和陌生人说话”是(D)原则的通俗表述A.接口隔离B.里氏代换C.依赖倒转D.迪米特2.当一个抽象模型有两个方面,其中一个方面依赖于另一方面,将这两者封装在独立的对象中以使它们可以各自独立地改变和复用,可以考虑使用(A)A.观察者模式B.命令模式C.适配器模式D.单例模式3.对于某些类来说,只有一个实例是非常重要的,例如,系统中可以有都种类型的打印机,但是只能有一个打印机假脱机,只应该一个文件系统和一个窗口管理器,为此,可以使用(C)。
C语言设计模式

C++有三个最重要的特点,即继承、封装、多态。
我发现其实C语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现面向对象语言的三个重要属性。
(1)继承性[cpp]view plaincopy1.typedef struct _parent2.{3.int data_parent;4.5.}Parent;6.7.typedef struct _Child8.{9.struct _parent parent;10.int data_child;11.12.}Child;在设计C语言继承性的时候,我们需要做的就是把基础数据放在继承的结构的首位置即可。
这样,不管是数据的访问、数据的强转、数据的访问都不会有什么问题。
(2)封装性[cpp]view plaincopy1.struct _Data;2.3.typedef void (*process)(struct _Data* pData);4.5.typedef struct _Data6.{7.int value;8. process pProcess;9.10.}Data;封装性的意义在于,函数和数据是绑在一起的,数据和数据是绑在一起的。
这样,我们就可以通过简单的一个结构指针访问到所有的数据,遍历所有的函数。
封装性,这是类拥有的属性,当然也是数据结构体拥有的属性。
(3)多态[cpp]view plaincopy1.typedef struct _Play2.{3.void* pData;4.void (*start_play)(struct _Play* pPlay);5.}Play;多态,就是说用同一的接口代码处理不同的数据。
比如说,这里的Play结构就是一个通用的数据结构,我们也不清楚pData是什么数据,start_play是什么处理函数?但是,我们处理的时候只要调用pPlay->start_play(pPlay)就可以了。
剩下来的事情我们不需要管,因为不同的接口会有不同的函数去处理,我们只要学会调用就可以了。
C#设计模式-状态者模式

C#设计模式-状态者模式⼀、状态者(State)模式每个对象都有其对应的状态,⽽每个状态⼜对应⼀些相应的⾏为,如果某个对象有多个状态时,那么就会对应很多的⾏为。
那么对这些状态的判断和根据状态完成的⾏为,就会导致多重条件语句,并且如果添加⼀种新的状态时,需要更改之前现有的代码。
这样的设计显然违背了开闭原则。
状态模式正是⽤来解决这样的问题的。
状态模式将每种状态对应的⾏为抽象出来成为单独新的对象,这样状态的变化不再依赖于对象内部的⾏为。
状态模式——允许⼀个对象在其内部状态改变时⾃动改变其⾏为,对象看起来就像是改变了它的类。
⼆、状态者模式的结构既然状态者模式是对已有对象的状态进⾏抽象,则⾃然就有抽象状态者类和具体状态者类,⽽原来已有对象需要保存抽象状态者类的引⽤,通过调⽤抽象状态者的⾏为来改变已有对象的⾏为。
经过上⾯的分析,状态者模式的结构图也就很容易理解了,具体结构图如下图⽰。
从上图可知,状态者模式涉及以下三个⾓⾊:Account类:维护⼀个State类的⼀个实例,该实例标识着当前对象的状态。
State类:抽象状态类,定义了⼀个具体状态类需要实现的⾏为约定。
SilveStater、GoldState和RedState类:具体状态类,实现抽象状态类的每个⾏为。
三、状态者模式的实现下⾯,就以银⾏账户的状态来实现下状态者模式。
银⾏账户根据余额可分为RedState、SilverState和GoldState。
这些状态分别代表透⽀账号,新开账户和标准账户。
账号余额在【-100.0,0.0】范围表⽰处于RedState状态,账号余额在【0.0 , 1000.0】范围表⽰处于SilverState,账号在【1000.0, 100000.0】范围表⽰处于GoldState状态。
下⾯以这样的⼀个场景实现下状态者模式,具体实现代码如下所⽰:using System;namespace StatePatternSample{public class Account{public State State { get; set; }public string Owner { get; set; }public Account(string owner){this.Owner = owner;this.State = new SilverState(0.0, this);}public double Balance { get { return State.Balance; } } // 余额// 存钱public void Deposit(double amount){State.Deposit(amount);Console.WriteLine("存款⾦额为 {0:C}——", amount);Console.WriteLine("账户余额为 =:{0:C}", this.Balance);Console.WriteLine("账户状态为: {0}", this.State.GetType().Name);Console.WriteLine();}// 取钱public void Withdraw(double amount){State.Withdraw(amount);Console.WriteLine("取款⾦额为 {0:C}——", amount);Console.WriteLine("账户余额为 =:{0:C}", this.Balance);Console.WriteLine("账户状态为: {0}", this.State.GetType().Name);Console.WriteLine();}// 获得利息public void PayInterest(){State.PayInterest();Console.WriteLine("Interest Paid --- ");Console.WriteLine("账户余额为 =:{0:C}", this.Balance);Console.WriteLine("账户状态为: {0}", this.State.GetType().Name);Console.WriteLine();}}// 抽象状态类// Propertiespublic Account Account { get; set; }public double Balance { get; set; } // 余额public double Interest { get; set; } // 利率public double LowerLimit { get; set; } // 下限public double UpperLimit { get; set; } // 上限public abstract void Deposit(double amount); // 存款public abstract void Withdraw(double amount); // 取钱public abstract void PayInterest(); // 获得的利息}// Red State意味着Account透⽀了public class RedState : State{public RedState(State state){// Initializethis.Balance = state.Balance;this.Account = state.Account;Interest = 0.00;LowerLimit = -100.00;UpperLimit = 0.00;}// 存款public override void Deposit(double amount){Balance += amount;StateChangeCheck();}// 取钱public override void Withdraw(double amount){Console.WriteLine("没有钱可以取了!");}public override void PayInterest(){// 没有利息}private void StateChangeCheck(){if (Balance > UpperLimit){Account.State = new SilverState(this);}}}// Silver State意味着没有利息得public class SilverState : State{public SilverState(State state): this(state.Balance, state.Account){}public SilverState(double balance, Account account) {this.Balance = balance;this.Account = account;Interest = 0.00;LowerLimit = 0.00;UpperLimit = 1000.00;}public override void Deposit(double amount){Balance += amount;StateChangeCheck();}public override void Withdraw(double amount){Balance -= amount;StateChangeCheck();}public override void PayInterest(){private void StateChangeCheck(){if (Balance < LowerLimit){Account.State = new RedState(this);}else if (Balance > UpperLimit){Account.State = new GoldState(this);}}}// Gold State意味着有利息状态public class GoldState : State{public GoldState(State state){this.Balance = state.Balance;this.Account = state.Account;Interest = 0.05;LowerLimit = 1000.00;UpperLimit = 1000000.00;}// 存钱public override void Deposit(double amount){Balance += amount;StateChangeCheck();}// 取钱public override void Withdraw(double amount) {Balance -= amount;StateChangeCheck();}public override void PayInterest(){Balance += Interest * Balance;StateChangeCheck();}private void StateChangeCheck(){if (Balance < 0.0){Account.State = new RedState(this);}else if (Balance < LowerLimit){Account.State = new SilverState(this);}}}class App{static void Main(string[] args){// 开⼀个新的账户var account = new Account("Learning Hard");// 进⾏交易// 存钱account.Deposit(1000.0);account.Deposit(200.0);account.Deposit(600.0);// 付利息account.PayInterest();// 取钱account.Withdraw(2000.00);account.Withdraw(500.00);// 等待⽤户输⼊Console.ReadKey();}}}账户余额为 =:¥1,000.00账户状态为:SilverState存款⾦额为¥200.00——账户余额为 =:¥1,200.00账户状态为:GoldState存款⾦额为¥600.00——账户余额为 =:¥1,800.00账户状态为:GoldStateInterest Paid ---账户余额为 =:¥1,890.00账户状态为:GoldState取款⾦额为¥2000.00——账户余额为 =:¥-110.00账户状态为:RedState没有钱可以取了!取款⾦额为¥500.00——账户余额为 =:¥-110.00账户状态为:RedState从上⾯输出的内容可以发现,进⾏存取款交易,会影响到Account内部的状态,由于状态的改变,从⽽影响到Account类⾏为的改变,⽽且这些操作都是发⽣在运⾏时的。
C语言实现《大话设计模式》中的代理模式例程

C语言实现《大话设计模式》中的代理模式例程分类:设计模式2012-06-12 11:07 545人阅读评论(0) 收藏举报设计模式语言cstructfunction[cpp]view plainc opyprint?1.#ifndef __PROXY_H__2.#define __PROXY_H__3.#include "rtthread.h"4.#include "finsh.h"5.//被追求者类6.typedef struct _SchoolGirl SchoolGirl;7.struct _SchoolGirl8.{9.char *Name;10.void (*SchoolGirlDelete)(SchoolGirl *pSchoolGirl);11.};12.static void SchoolGirlDelete(SchoolGirl *pSchoolGirl)13.{14. rt_free(pSchoolGirl);15.}16.SchoolGirl *SchoolGirlCreate(char *Name)17.{18. SchoolGirl *pSchoolGirl = (SchoolGirl *)rt_malloc(sizeof(SchoolGirl));19. pSchoolGirl->Name = Name;20. pSchoolGirl->SchoolGirlDelete = SchoolGirlDelete;21.return pSchoolGirl;22.}23.//追求者类24.typedef struct _Pursuit Pursuit;25.struct _Pursuit26.{27. SchoolGirl *mm;28.void (*PursuitDelete)(void *pPursuit);29.void (*GiveDolls)(Pursuit *pPursuit);30.void (*GiveFlowers)(Pursuit *pPursuit);31.void (*GiveChocolate)(Pursuit *pPursuit);32.};33.static void PursuitDelete(void *pPursuit)34.{35. rt_free(pPursuit);36.}37.static void PursuitGiveDolls(Pursuit *pPursuit)38.{39. rt_kprintf(" %s, 送你洋娃娃\n", pPursuit->mm->Name);40.}41.static void PursuitGiveFlowers(Pursuit *pPursuit)42.{43. rt_kprintf(" %s, 送你鲜花\n", pPursuit->mm->Name);44.}45.static void PursuitGiveChocolate(Pursuit *pPursuit)46.{47. rt_kprintf(" %s, 送你巧克力\n", pPursuit->mm->Name);48.}49.Pursuit *PursuitCreate(SchoolGirl *mm)50.{51. Pursuit *pPursuit = (Pursuit *)rt_malloc(sizeof(Pursuit));52. pPursuit->mm = mm;53. pPursuit->PursuitDelete = PursuitDelete;54. pPursuit->GiveDolls = PursuitGiveDolls;55. pPursuit->GiveFlowers = PursuitGiveFlowers;56. pPursuit->GiveChocolate = PursuitGiveChocolate;57.return pPursuit;58.}59.//代理者类60.typedef struct _Proxy Proxy;61.struct _Proxy62.{63. Pursuit *gg;64.void (*ProxyDelete)(void *pProxy);65.void (*GiveDolls)(Proxy *pProxy);66.void (*GiveFlowers)(Proxy *pProxy);67.void (*GiveChocolate)(Proxy *pProxy);68.};69.static void ProxyDelete(void *pProxy)70.{71. ((Proxy *)pProxy)->gg->PursuitDelete(((Proxy *)pProxy)->gg);72. rt_free(pProxy);73.}74.static void ProxyGiveDolls(Proxy *pProxy)75.{76. pProxy->gg->GiveDolls(pProxy->gg);77.}78.static void ProxyGiveFlowers(Proxy *pProxy)79.{80. pProxy->gg->GiveFlowers(pProxy->gg);81.}82.static void ProxyGiveChocolate(Proxy *pProxy)83.{84. pProxy->gg->GiveChocolate(pProxy->gg);85.}86.Proxy *ProxyCreate(SchoolGirl *mm)87.{88. Proxy *pProxy = (Proxy *)rt_malloc(sizeof(Proxy));89. pProxy->gg = PursuitCreate(mm);90. pProxy->ProxyDelete = ProxyDelete;91. pProxy->GiveDolls = ProxyGiveDolls;92. pProxy->GiveFlowers = ProxyGiveFlowers;93. pProxy->GiveChocolate = ProxyGiveChocolate;94.return pProxy;95.}96.#endif97.98.99.#include "Proxy.h"100.//客户端101.void ProxyModle(void)102.{103. SchoolGirl *jiaojiao = SchoolGirlCreate("李娇娇");104. Proxy *daili = ProxyCreate(jiaojiao);105. daili->GiveDolls(daili);106. daili->GiveFlowers(daili);107. daili->GiveChocolate(daili);108.109. jiaojiao->SchoolGirlDelete(jiaojiao);110. daili->ProxyDelete(daili);111.}112.113.FINSH_FUNCTION_EXPORT(ProxyModle, Proxy Modle);代理是真实对像的代表,它跟真实对像类属于关联关系,实现相同的接口,调用时调用代理,但真正处理时却是真实对像。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
前言:设计模式是软件开发领域的精髓之一。
学好设计模式是目前每一个开发人员的必修课。
目前关于设计模式的书很多,其中比较好的有GOF那本的中译本,但并不很适合初学者。
还有一本是《JAVA与模式》,比较适合初学者使用,在此强烈推荐。
但这本书的不足之处是一些地方讲的过于繁琐,很多地方只须简单说明一下即可,却大费笔墨,使得书籍很厚,看起来费力。
而且是用JAVA描述的,这使得一些只懂C#的人无从下手。
我是一个.net的拥护者,为了看这本书我特意看了些JAVA的书,感觉JAVA在书籍的多样性方面比 .net好很多,而且不少书籍的质量很高。
可能是现在JAVA已经比较成熟的原因吧。
为了方便.net的爱好者学习设计模式,在此把我学习《JAVA与模式》这本书的学习笔记发出来,并用C#语言重新描述,希望能对初学者有所帮助。
其实设计模式也并不是什么高深的理论,个人认为并不是象一些人所说的“没写过10万代码就不要谈设计模式”,只要用心学习与实践是完全能够掌握的。
简单工厂模式是类的创建模式,又叫做静态工厂方法模式。
就是由一个工厂类根据传入的参量决定创建出哪一种产品类的实例。
一般涉及到三种角色(如下图):
工厂类:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。
工厂类在客户端的直接调用下创建产品对象,它往往由一个具体的类实现。
抽象产品角色:担任这个角色的类是由工厂方法模式所创建的对象的父类,或她们共同拥有的接口。
一般由接口或抽象类实现。
具体产品角色:工厂方法模式所创建的任何对
象都是这个角色的实例,由具体类实现。
简单工厂模式优缺点:
模式的核心是工厂类,这个类负责产品的创建,而客户端可以免去产品创建的责任,这实现了责任的分割。
但由于工厂类集中了所有产品创建逻辑的,如果不能正常工作的话会对系统造成很大的影响。
如果增加新产品必须修改工厂角色的源码。
以园丁种植水果为例讨论该模式的具体实现:
Fruit 水果接口,规定水果具有的一些共同特性
Apple 苹果类派生自Fruit接口
Strawberry 草莓类派生自Fruit接口
FruitGardener 园丁类负责草莓与苹果的创建工作。
当Client要创建水果(苹果或草莓对象)的时候调用园丁类的factory 方法创建:UML图如下:
代码如下:
Fruit.cs
namespace Simple_Factory
{
public interface Fruit
{
//生长
void grow();
//收获
void harvest();
//种植
void plant();
}
}
Apple.cs
namespace Simple_Factory
{
public class Apple:Fruit
{
public Apple()
{
}
#region Fruit 成员
public void grow()
{
Console.WriteLine ("Apple is growing.......");
}
public void harvest()
{
Console.WriteLine ("Apple is harvesting.......");
}
public void plant()
{
Console.WriteLine ("Apple is planting.......");
}
#endregion
}
}
Strawberry.cs
namespace Simple_Factory
{
public class Strawberry:Fruit
{
public Strawberry()
{
}
#region Fruit 成员
public void grow()
{
Console.WriteLine ("Strawberry is growing......."); }
public void harvest()
{
Console.WriteLine ("Strawberry is harvesting......."); }
public void plant()
{
Console.WriteLine ("Strawberry is planting......."); }
#endregion
}
}
FruitGardener.cs
namespace Simple_Factory
{
public class FruitGardener
{
//静态工厂方法
public static Fruit factory(string which)
{
if(which.Equals ("Apple"))
{
return new Apple();
}
else if(which.Equals ("Strawberry"))
{
return new Strawberry ();
}
else
{
return null;
}
}
}
}
Client.cs
using System;
namespace Simple_Factory
{
class Client
{
[STAThread]
static void Main(string[] args)
{
Fruit aFruit=FruitGardener.factory ("Apple");//creat apple
aFruit.grow ();
aFruit.harvest ();
aFruit.plant();
aFruit=FruitGardener.factory ("Strawberry");//creat strawberry aFruit.grow ();
aFruit.harvest ();
aFruit.plant();
}
}
}
输出如下:
Apple is growing.......
Apple is harvesting.......
Apple is planting.......
Strawberry is growing.......
Strawberry is harvesting.......
Strawberry is planting.......
简单工厂模式的基本原理:
创建一个抽象工厂,它决定返回哪一个类的实例并将该实例返回。
接下来可以调用那个类实例的方法,但不需要知道具体使用的是哪一个子类,这种方法把和数据相关的问题与类的其他方法分隔开来。
它能返回具有同样方法的类的实例,它们可以是不同的派生子类的实例,也可以是实际上毫无关系仅仅是共享了相同接口的类。
不管哪一种类实例中的方法必须是相同的,并且能够被交替使用。