看不见PPT的请自行解决DNS污染问题。

相关类的代码:

  1. namespace FactoryPatternConsole.Model
  2. {
  3. public class Address
  4. {
  5. public string CountryCode { get; set; }
  6. }
  7. }

Address

  1. namespace FactoryPatternConsole.Model
  2. {
  3. public class Order
  4. {
  5. public decimal TotalCost { get; set; }
  6. public decimal WeightInKG { get; set; }
  7. public string CourierTrackingId { get; set; }
  8. public Address DispatchAddress { get; set; }
  9. }
  10. }

Order

  1. namespace FactoryPatternConsole.Model
  2. {
  3. public interface IShippingCourier
  4. {
  5. string GenerateConsignmentLabelFor(Address address);
  6. }
  7. }

IShippingCourier

  1. namespace FactoryPatternConsole.Model
  2. {
  3. public class DHL : IShippingCourier
  4. {
  5. public string GenerateConsignmentLabelFor(Address address)
  6. {
  7. return "DHL-XXXX-XXXX-XXXX";
  8. }
  9. }
  10. }

DHL

  1. namespace FactoryPatternConsole.Model
  2. {
  3. public class RoyalMail:IShippingCourier
  4. {
  5. public string GenerateConsignmentLabelFor(Address address)
  6. {
  7. return "RM-XXXX-XXXX-XXXX";
  8. }
  9. }
  10. }

RoyalMail

  1. using FactoryPatternConsole.Model;
  2.  
  3. namespace FactoryPatternConsole.Factory
  4. {
  5. public static class UKShippingCourierFactory
  6. {
  7. public static IShippingCourier CreateShippingCourier(Order order)
  8. {
  9. if (order.TotalCost > || order.WeightInKG > )
  10. {
  11. return new DHL();
  12. }
  13. else
  14. {
  15. return new RoyalMail();
  16. }
  17. }
  18. }
  19. }

UKShippingCourierFactory

  1. using FactoryPatternConsole.Factory;
  2. using FactoryPatternConsole.Model;
  3.  
  4. namespace FactoryPatternConsole.Service
  5. {
  6. public class OrderService
  7. {
  8. public void Dispatch(Order order)
  9. {
  10. IShippingCourier shippingCourier = UKShippingCourierFactory.CreateShippingCourier(order);
  11.  
  12. order.CourierTrackingId = shippingCourier.GenerateConsignmentLabelFor(order.DispatchAddress);
  13. }
  14. }
  15. }

OrderService


测试用代码:

  1. using FactoryPatternConsole.Model;
  2. using FactoryPatternConsole.Service;
  3. using System;
  4.  
  5. namespace FactoryPatternConsole
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. OrderService service = new OrderService();
  12. foreach (Order order in GetOrders())
  13. {
  14. service.Dispatch(order);
  15. Console.WriteLine(string.Format("TotalCost:{0}, WeightInKG:{1}, CourierTrackingId:{2}",
  16. order.TotalCost, order.WeightInKG, order.CourierTrackingId));
  17. }
  18. Console.ReadLine();
  19. }
  20.  
  21. public static Order[] GetOrders()
  22. {
  23. return new Order[] {
  24. new Order()
  25. {
  26. TotalCost = ,
  27. WeightInKG = ,
  28. DispatchAddress = new Address() { CountryCode = "CN" },
  29. },
  30. new Order()
  31. {
  32. TotalCost = 100.1m,
  33. WeightInKG = ,
  34. DispatchAddress = new Address() { CountryCode = "CN" },
  35. },
  36. new Order()
  37. {
  38. TotalCost = ,
  39. WeightInKG = 5.1m,
  40. DispatchAddress = new Address() { CountryCode = "CN" },
  41. },
  42. };
  43. }
  44. }
  45. }

Program


执行结果:

【设计模式】工厂方法(FactoryMethod)模式的更多相关文章

  1. 一天一个设计模式——工厂方法(FactoryMethod)模式

    一.模式说明 在前一个模板方法(Template Method)模式中,父类定义了处理流程,而流程中用到的方法交给子类去实现.类似的,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类 ...

  2. 设计模式之工厂方法(FactoryMethod)模式

    在五大设计原则的基础上经过GOF(四人组)的总结,得出了23种经典设计模式,其中分为三大类:创建型(5种).结构型(7种).行为型(11种).今天对创建型中的工厂方法(FactoryMethod)模式 ...

  3. 工厂方法(FactoryMethod)模式

    之前说了简单工厂设计模式如果增加一个新的运算的时候需要:增加一个具体的实现类,工厂类中增加一个case分支.也就是说我们不但对扩展开发了,也对修改开放了,违背了开闭原则.当然如果工厂类采用反射的话不存 ...

  4. 4. 星际争霸之php设计模式--工厂方法模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  5. C++设计模式——工厂方法模式

    本文版权归果冻说所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.» 本文链接:http://www.jellythink.com/arch ...

  6. 工厂方法FactoryMethod 初步学习笔记

    一,意图   定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 二,别名   虚构造器 Virtual Constructor 三,适用性 当一个类不知道它 ...

  7. 设计模式-工厂方法模式(FactoryMethod)

    简介: 简单工厂模式将类的示例化放在工厂对象中. 工厂方法模式是简单工厂模式的延伸,不同的是其将子类的实例化延迟到子类工厂中实现,本身仅定义一个创建对象的接口. 工厂方法模式主要由四部分组成: 1.抽 ...

  8. Java设计模式---工厂方法模式(Factory-Method)

    一.普通工厂模式 建立一个工厂类,对实现了同一接口的一些类进行实例的创建 实例代码: 发送短信和邮件的例子,首先创建接口: public interface Sender { public void ...

  9. Python设计模式——工厂方法模式(FactoryMethod)

    需求:有一个学雷锋活动,有买米和扫地两个内容,参与的人有大学生和社区志愿者,他们各自的方法不一样. 如果用简单工厂模式实现: #encoding=utf-8 __author__ = 'kevinlu ...

  10. 设计模式-工厂方法模式(FactoryMethod)

    工厂方法模式又称多态工厂模式.工厂方法模式是定义一个创建产品对象的接口(FruitFactory),将具体创建工作给具体的实现类(AppFactory,BananaFactory,PearFactor ...

随机推荐

  1. 基于Linux的嵌入式文件系统构建与设计

    摘 要:Linux是当今一种十分流行的嵌入式操作系统.由于其具有执行效率高.占用空间小.实时性能优良和可扩展性强等特点,因此被广泛应用于工业控制领域.该文对其文件系统进行了简单的介绍,结合嵌入式系统应 ...

  2. 平滑升级nginx

    平滑升级nginx版本技术文档 作者 联系方式 日期 版本号 马坤 852115346@qq.com 2017-12-31 V1.0.0 备注:作者水平有限,难免出现错误.如若发现错误,请您及时与作者 ...

  3. cf 487E Tourist

    题目大意 给定\(n\)个点\(m\)条边的无向连通图,无重边 每个点有点权 两个操作: 1.单点点权修改 2.询问从x到y的简单路径中,路径经过点的最小值的最小值时多少 (简单路径指经过每一个点至多 ...

  4. sql2008百万级数据排除重复信息

    --高性能排除重复select userid from table where userid in ( select userid from ( select userid, row_number() ...

  5. ASP.NET的最新安全漏洞Important: ASP.NET Security Vulnerability

    原文发布时间为:2010-09-20 -- 来源于本人的百度文章 [由搬家工具导入] 原文:http://weblogs.asp.net/scottgu/archive/2010/09/18/impo ...

  6. Func<T1, T2, TResult> Delegate 系统Func委托类型

    原文发布时间为:2011-03-25 -- 来源于本人的百度文章 [由搬家工具导入] http://msdn.microsoft.com/en-us/library/bb534647%28v=VS.1 ...

  7. 从数据库的表导出到Excel表格中【让客户端下载的Excel】

    原文发布时间为:2008-10-11 -- 来源于本人的百度文章 [由搬家工具导入] 这个例子是从gridview中导出到Excel,可以举一反三,可以直接从数据库中取值放在DataSet中,然后再从 ...

  8. 点击添加按钮,使用ajax动态添加一行和移除一行,并且序号重新排序和数据不重复操作判断

    <div class="control-group " style="top: -20px;position: relative;"> <la ...

  9. Chrome 75 将原生支持图片懒加载

    4 月 6 日,Google 的 Chrome & Web 平台工程经理 Addy Osmani 在个人博客发文,介绍到 <img> 和 <iframe> 的 load ...

  10. 长安大学第四届“迎新杯”程序设计竞赛 H 圣诞节糖果【二分】

    时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 131072K,其他语言262144K64bit IO Format: %lld 题目描述 圣诞节临近,彩虹岛的黑心商人