【设计模式】工厂方法(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 ...
随机推荐
- 【POJ2774】Long Long Message (SA)
最长公共子串...两个字符串连在一起,中间放一个特殊字符隔开.求出height之后,枚举height,看两个后缀是不是分布于两段字符串..如果是,这个值就可以作为答案.取最大值即可. ; var c, ...
- [CQOI2014][bzoj3507] 通配符匹配 [字符串hash+dp]
题面 传送门 思路 0x01 KMP 一个非常显然而优秀的想法:把模板串按照'*'分段,然后对于每一段求$next$,'?'就当成可以对于任意字符匹配就行了 对于每个文本串,从前往后找第一个可以匹配的 ...
- hashcode和equals方法
转自https://www.cnblogs.com/keyi/p/7119825.html 一.equals方法的作用 1.默认情况(没有覆盖equals方法)下equals方法都是调用Object类 ...
- Java EE 学习(8):IDEA + maven + spring 搭建 web(4)- 用户管理
转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) ava E ...
- Docker Daemon 连接方式详解
前言 在 Docker 常用详解指令 一文中粗粗提了一下, Docker 是分为客户端和服务端两部分的, 本文将介绍客户端是如何连接服务端的. 连接方式 1. UNIX域套接字 默认就是这种方式, 会 ...
- UOJ Goodbye Bingshen
在叶子童鞋的推荐下打了这场比赛... 感觉被虐爆了... 怎么这么多构造题... 我还没写过呢... 交互题是毛线...看了好久没看懂...就放弃了...(我语文好差QAQ...) 最后只会T1... ...
- 【HDOJ5532】Almost Sorted Array(签到)
题意:给定一个n个数的数列,问删掉一个数之后剩余部分是否可以单调不增或单调不减 n<=1e5,a[i]<=1e5 思路:预处理一下前后缀是否合法 #include<cstdio> ...
- JavaScript内部是这样运行
编译阶段 词法分析(Lexing) 这个过程会将由字符组成的字符串分解成(对编程语言来说)有意义的代码块,这些代 码块被称为词法单元(token). 简单举个例子:c = b - a 转换为 NAME ...
- 【linux】进程存储管理
看<Linux高级程序设计>的笔记 设有一个hello的可执行文件 ①显示该文件的基本信息 ls hello -l ②文件基本情况 file hello ③列出文件的存储区域情况 size ...
- JSON Web Token的使用
定义 JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息. 适用场景 1.用于向Web应用传递一些非敏感信息.例如完成加好友.下 ...