【设计模式】工厂方法(FactoryMethod)模式
看不见PPT的请自行解决DNS污染问题。
相关类的代码:
- namespace FactoryPatternConsole.Model
- {
- public class Address
- {
- public string CountryCode { get; set; }
- }
- }
Address
- namespace FactoryPatternConsole.Model
- {
- public class Order
- {
- public decimal TotalCost { get; set; }
- public decimal WeightInKG { get; set; }
- public string CourierTrackingId { get; set; }
- public Address DispatchAddress { get; set; }
- }
- }
Order
- namespace FactoryPatternConsole.Model
- {
- public interface IShippingCourier
- {
- string GenerateConsignmentLabelFor(Address address);
- }
- }
IShippingCourier
- namespace FactoryPatternConsole.Model
- {
- public class DHL : IShippingCourier
- {
- public string GenerateConsignmentLabelFor(Address address)
- {
- return "DHL-XXXX-XXXX-XXXX";
- }
- }
- }
DHL
- namespace FactoryPatternConsole.Model
- {
- public class RoyalMail:IShippingCourier
- {
- public string GenerateConsignmentLabelFor(Address address)
- {
- return "RM-XXXX-XXXX-XXXX";
- }
- }
- }
RoyalMail
- using FactoryPatternConsole.Model;
- namespace FactoryPatternConsole.Factory
- {
- public static class UKShippingCourierFactory
- {
- public static IShippingCourier CreateShippingCourier(Order order)
- {
- if (order.TotalCost > || order.WeightInKG > )
- {
- return new DHL();
- }
- else
- {
- return new RoyalMail();
- }
- }
- }
- }
UKShippingCourierFactory
- using FactoryPatternConsole.Factory;
- using FactoryPatternConsole.Model;
- namespace FactoryPatternConsole.Service
- {
- public class OrderService
- {
- public void Dispatch(Order order)
- {
- IShippingCourier shippingCourier = UKShippingCourierFactory.CreateShippingCourier(order);
- order.CourierTrackingId = shippingCourier.GenerateConsignmentLabelFor(order.DispatchAddress);
- }
- }
- }
OrderService
测试用代码:
- using FactoryPatternConsole.Model;
- using FactoryPatternConsole.Service;
- using System;
- namespace FactoryPatternConsole
- {
- class Program
- {
- static void Main(string[] args)
- {
- OrderService service = new OrderService();
- foreach (Order order in GetOrders())
- {
- service.Dispatch(order);
- Console.WriteLine(string.Format("TotalCost:{0}, WeightInKG:{1}, CourierTrackingId:{2}",
- order.TotalCost, order.WeightInKG, order.CourierTrackingId));
- }
- Console.ReadLine();
- }
- public static Order[] GetOrders()
- {
- return new Order[] {
- new Order()
- {
- TotalCost = ,
- WeightInKG = ,
- DispatchAddress = new Address() { CountryCode = "CN" },
- },
- new Order()
- {
- TotalCost = 100.1m,
- WeightInKG = ,
- DispatchAddress = new Address() { CountryCode = "CN" },
- },
- new Order()
- {
- TotalCost = ,
- WeightInKG = 5.1m,
- DispatchAddress = new Address() { CountryCode = "CN" },
- },
- };
- }
- }
- }
Program
执行结果:
【设计模式】工厂方法(FactoryMethod)模式的更多相关文章
- 一天一个设计模式——工厂方法(FactoryMethod)模式
一.模式说明 在前一个模板方法(Template Method)模式中,父类定义了处理流程,而流程中用到的方法交给子类去实现.类似的,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类 ...
- 设计模式之工厂方法(FactoryMethod)模式
在五大设计原则的基础上经过GOF(四人组)的总结,得出了23种经典设计模式,其中分为三大类:创建型(5种).结构型(7种).行为型(11种).今天对创建型中的工厂方法(FactoryMethod)模式 ...
- 工厂方法(FactoryMethod)模式
之前说了简单工厂设计模式如果增加一个新的运算的时候需要:增加一个具体的实现类,工厂类中增加一个case分支.也就是说我们不但对扩展开发了,也对修改开放了,违背了开闭原则.当然如果工厂类采用反射的话不存 ...
- 4. 星际争霸之php设计模式--工厂方法模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- C++设计模式——工厂方法模式
本文版权归果冻说所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.» 本文链接:http://www.jellythink.com/arch ...
- 工厂方法FactoryMethod 初步学习笔记
一,意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 二,别名 虚构造器 Virtual Constructor 三,适用性 当一个类不知道它 ...
- 设计模式-工厂方法模式(FactoryMethod)
简介: 简单工厂模式将类的示例化放在工厂对象中. 工厂方法模式是简单工厂模式的延伸,不同的是其将子类的实例化延迟到子类工厂中实现,本身仅定义一个创建对象的接口. 工厂方法模式主要由四部分组成: 1.抽 ...
- Java设计模式---工厂方法模式(Factory-Method)
一.普通工厂模式 建立一个工厂类,对实现了同一接口的一些类进行实例的创建 实例代码: 发送短信和邮件的例子,首先创建接口: public interface Sender { public void ...
- Python设计模式——工厂方法模式(FactoryMethod)
需求:有一个学雷锋活动,有买米和扫地两个内容,参与的人有大学生和社区志愿者,他们各自的方法不一样. 如果用简单工厂模式实现: #encoding=utf-8 __author__ = 'kevinlu ...
- 设计模式-工厂方法模式(FactoryMethod)
工厂方法模式又称多态工厂模式.工厂方法模式是定义一个创建产品对象的接口(FruitFactory),将具体创建工作给具体的实现类(AppFactory,BananaFactory,PearFactor ...
随机推荐
- 基于Linux的嵌入式文件系统构建与设计
摘 要:Linux是当今一种十分流行的嵌入式操作系统.由于其具有执行效率高.占用空间小.实时性能优良和可扩展性强等特点,因此被广泛应用于工业控制领域.该文对其文件系统进行了简单的介绍,结合嵌入式系统应 ...
- 平滑升级nginx
平滑升级nginx版本技术文档 作者 联系方式 日期 版本号 马坤 852115346@qq.com 2017-12-31 V1.0.0 备注:作者水平有限,难免出现错误.如若发现错误,请您及时与作者 ...
- cf 487E Tourist
题目大意 给定\(n\)个点\(m\)条边的无向连通图,无重边 每个点有点权 两个操作: 1.单点点权修改 2.询问从x到y的简单路径中,路径经过点的最小值的最小值时多少 (简单路径指经过每一个点至多 ...
- sql2008百万级数据排除重复信息
--高性能排除重复select userid from table where userid in ( select userid from ( select userid, row_number() ...
- ASP.NET的最新安全漏洞Important: ASP.NET Security Vulnerability
原文发布时间为:2010-09-20 -- 来源于本人的百度文章 [由搬家工具导入] 原文:http://weblogs.asp.net/scottgu/archive/2010/09/18/impo ...
- Func<T1, T2, TResult> Delegate 系统Func委托类型
原文发布时间为:2011-03-25 -- 来源于本人的百度文章 [由搬家工具导入] http://msdn.microsoft.com/en-us/library/bb534647%28v=VS.1 ...
- 从数据库的表导出到Excel表格中【让客户端下载的Excel】
原文发布时间为:2008-10-11 -- 来源于本人的百度文章 [由搬家工具导入] 这个例子是从gridview中导出到Excel,可以举一反三,可以直接从数据库中取值放在DataSet中,然后再从 ...
- 点击添加按钮,使用ajax动态添加一行和移除一行,并且序号重新排序和数据不重复操作判断
<div class="control-group " style="top: -20px;position: relative;"> <la ...
- Chrome 75 将原生支持图片懒加载
4 月 6 日,Google 的 Chrome & Web 平台工程经理 Addy Osmani 在个人博客发文,介绍到 <img> 和 <iframe> 的 load ...
- 长安大学第四届“迎新杯”程序设计竞赛 H 圣诞节糖果【二分】
时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 131072K,其他语言262144K64bit IO Format: %lld 题目描述 圣诞节临近,彩虹岛的黑心商人