




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
设计模式学习之简单工厂(simple facotry)、工厂方法(actory method)、抽象工厂(abstract factory) 一.简单工厂(Simple Factory)GOF没有把简单工厂作为设计模式之一列出。但是为了学习后面的两种工厂模式,还是先来了解一下简单工厂。作用:专门由一个类来决定实例化哪个产品类实现要点:可能很多人平时都不知不觉地使用了简单工厂。简单工厂就是把决定实例化哪个类的方法放到一个单独的类(所谓的工厂类)里。UML:代码: abstract class Product public abstract void showProduct(); class ProductA : Product public override void showProduct() Console.WriteLine(this is productA); class ProductB : Product public override void showProduct() Console.WriteLine(this is productB); /factory class Factory public Product getProduct(int type) if (type = 0) return new ProductA(); else return new ProductB(); /-执行-class Program static void Main(string args) Factory f = new Factory(); Product p1 = f.getProduct(0); Product p2 = f.getProduct(1); p1.showProduct(); p2.showProduct(); Console.ReadLine(); 二.工厂方法(Factory Method)作用:工厂方法是简单工厂的“再抽象”,不在某个类里直接决定实例化哪个产品类,而是把这个决定延迟到它的子类里面。(至于为什么要抽象出父类,参见之前的文章“父类引用指向子类对象”)。实现要点:抽象工厂类,由其子类决定实例化哪个产品类。UML:代码:abstract class Product public abstract void showProduct(); class ProductA : Product public override void showProduct() Console.WriteLine(this is productA); class ProductB : Product public override void showProduct() Console.WriteLine(this is productB); /factory abstract class Factory public abstract Product getProduct(); class FacotryA : Factory public override Product getProduct() return new ProductA(); class FacotryB : Factory public override Product getProduct() return new ProductB(); /-执行- class Program static void Main(string args) Factory f = new Factory2; f0 = new FacotryA(); f1 = new FacotryB(); foreach (Factory myfactory in f) Product p = myfactory.getProduct(); p.showProduct(); Console.ReadLine(); 三.抽象工厂(Abstract Factory)作用:客户类需要不同的产品组合来满足自己的需求,客户只关心“产品组合”的效果,而不想关心具体的产品细节。实现要点:由抽象工厂类(本例中的Home类)的子类来决定选择哪些具体产品组(选bed,sofa,door,desk等);使用这个工厂时,客户类(Client类)先声明一个抽象工厂的类,比如本例中Client类的构造函数里需要一个Home类型的参数,调用者在实例化客户类(main函数中的client1和client2)时,参数直接传入具体的工厂类(本例的SimpleHome或者AdvancedHome)即可,这样调用者不需要知道具体的产品类有哪些(本例中的bed,sofa,door,desk等),就能通过选择工厂类型(本例中的SimpleHome或者AdvancedHome)来获得一系列的产品类型(bed,sofa,door,desk等)。UML:代码:abstract class Products public abstract void showProduct(); class ProductBed : Products public override void showProduct() Console.WriteLine(exist a Bed); class ProductDesk : Products public override void showProduct() Console.WriteLine(exist a Desk); class ProductDoor : Products public override void showProduct() Console.WriteLine(exist a Door); class ProductSofa : Products public override void showProduct() Console.WriteLine(exist a Sofa); /abstractfactory,这里是一个抽象的“家” abstract class Home protected Products myBed,myDesk,myDoor,mySofa; public abstract void showMyHouse(); /简单的家:只需要门和床 class SimpleHome : Home public SimpleHome() myBed = new ProductBed(); myDoor = new ProductDoor(); public override void showMyHouse() Console.WriteLine(this is a simple Home:); myBed.showProduct(); myDoor.showProduct(); /高级一点的家:还有沙发,桌子等家具 class AdvancedHome : Home public AdvancedHome() myBed = new ProductBed(); myDoor = new ProductDoor(); mySofa = new ProductSofa(); myDesk = new ProductDesk(); public override void showMyHouse() Console.WriteLine(this is a advanced Home:); myBed.showProduct(); myDoor.showProduct(); mySofa.showProduct(); myDesk.showProduct(); /调用抽象工厂的客户类 class Client Home myHome; public Client(Home newHome) this.myHome = newHome; public void showHome() myHome.showMyHouse(); /-执行-class Program static void Main(string args) /客户不需要选择具体家具了,只需要选择具体的房子类型就可以了,家具自动配好。 Client client1 = new Client(new SimpleHome(); client1.showHome(); Client client2 = new Client(new AdvancedHome(); client2.showHome(); Console.ReadLine(); 总是有人出来追究抽象工厂和工厂方法的区别,它们本来目的就不同,所以不好比: 工厂方法其实应该是一种思想,我要用一个东西,但是现在又没法确定它怎么办,留下一个接口,由其它对象以后实现。这样就可以把易变的、不确定的部分分离出来,也就
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 立秋的节气典籍
- 共育校园记忆
- 全球区块链研发的趋势与经验
- 研学旅游的国际化发展路径
- 绿色氢基能源未来展望
- 智能汽车保险与风险管理行业深度调研及发展战略咨询报告
- 智能监测建筑结构健康系统企业制定与实施新质生产力战略研究报告
- 环保包装材料教育普及企业制定与实施新质生产力战略研究报告
- 学习的课件题目
- 基于人工智能的装卸搬运方案优化研究-洞察阐释
- GB/T 14981-2009热轧圆盘条尺寸、外形、重量及允许偏差
- 绳据法钢筋混凝土护栏切割破除方案计划
- 高压开关柜基础知识培训课件
- 企业临时用工合同范本(5篇)
- 2023年武汉民政职业学院单招考试面试模拟试题及答案解析
- 中国军事发展简述课件
- 碧桂园物业案场私宴接待操作规程
- 核医学工作中辐射防护课件
- 路基路面平整度试验检测记录表(三米直尺法)
- GB-T 1040.2-2022 塑料 拉伸性能的测定 第2部分:模塑和挤塑塑料的试验条件
- 广东开放大学计算机应用技术(互联网营销)专业毕业设计0
评论
0/150
提交评论