【设计模式】工厂方法(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 ...
随机推荐
- Unity 碰撞检测
武器与怪物的碰撞 目前来说有三种思路,其实前两种算变种了: 1.动画关键帧回调 + 范围检测.http://blog.csdn.net/u013700908/article/details/52888 ...
- 手机安装app总是显示未安装
手机安装软件总是显示未安装 查看是否开启了护眼模式或者护眼工具等干扰屏幕的软件.关掉,再安装即可
- HDU 3333 Turing Tree(离线树状数组)
Turing Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 3987 Harry Potter and the Forbidden Forest(边权放大法+最小割)
Harry Potter and the Forbidden Forest Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65536/ ...
- vue 中父子组件传值:props和$emit
更新----------- 1 父组件向子组件传值:通过props数组: 在vue-cli Login.vue父组件中有AcceptAndRefuse.vue子组件,首先import进子组件hello ...
- mongodb使用1
首先官网下载mongodb放在根目录下.新建db文件夹,在命令行中进入bin路径,然后运行mongod开启命令,同时用--dbpath指定数据存放地点为“db”文件夹 mongod --dbpath= ...
- 【HugeChm】HugeChm制作chm帮助文档
1.下载软件:HugeChm.exe 2.开始打包: 3.选择开始打包即可
- 使用git快捷方便的保存代码
大家都在使用git保存和备份代码,下面我们就来学习下吧. 一.本地安装和配置git 1.安装git pacman -S git //如果没有问题的话就可以安装成功了 2.验证 git --versio ...
- c# 扩展LINQ的order by函数支持通过字符串来指定列名并支持多列
本文借鉴了https://blog.csdn.net/lan_liang/article/details/68523451. 将字符串转换为orderby的linq可以极大地减少重复劳动,可是该怎样将 ...
- Codeforces Gym101473 E.Dangerous Dive (2013-2014 ACM-ICPC Brazil Subregional Programming Contest)
代码: 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<cmat ...