参考了下网上的工厂模式实现,总的来说例子还是OK得,但是示例太单一了,因此我做了下优化的改良实现。

namespace DP
{
public interface ICreditCard
{
string GetCardType();
int GetCreditLimit();
int GetAnnualCharge();
} //Concrete Product 1
public class MoneyBackCreditCard : ICreditCard
{
public string GetCardType()
=> "MoneyBack";
public int GetCreditLimit()
=> 15000;
public int GetAnnualCharge()
=> 500;
}
//Concrete Product 2
public class TitaniumCreditCard : ICreditCard
{
public string GetCardType()
=> "Titanium";
public int GetCreditLimit()
=> 25000;
public int GetAnnualCharge()
=> 1500;
}
//Concrete Product 3
public class PlatinumCreditCard : ICreditCard
{
public string GetCardType() => "Platinum";
public int GetCreditLimit() => 35000;
public int GetAnnualCharge() => 2000;
} public abstract class CreditCardFactory
{
protected abstract ICreditCard MakeProduct(); public ICreditCard CreateCreditCard() => MakeProduct();
} public class MoneyBackFactory : CreditCardFactory
{
protected override ICreditCard MakeProduct() => new MoneyBackCreditCard();
} public class PlatinumFactory : CreditCardFactory
{
protected override ICreditCard MakeProduct() => new PlatinumCreditCard();
} public class TitaniumFactory : CreditCardFactory
{
protected override ICreditCard MakeProduct() => new TitaniumCreditCard();
} }

客户端调用:

ICreditCard CreditCardInstance = new PlatinumFactory().CreateCreditCard();
if (CreditCardInstance != null)
{
Console.WriteLine("CardType : " + CreditCardInstance.GetCardType());
Console.WriteLine("CreditLimit : " + CreditCardInstance.GetCreditLimit());
Console.WriteLine("AnnualCharge :" + CreditCardInstance.GetAnnualCharge());
}
else
{
Console.Write("Invalid Card Type");
}
Console.WriteLine("--------------");
CreditCardInstance = new MoneyBackFactory().CreateCreditCard();
if (CreditCardInstance != null)
{
Console.WriteLine("CardType : " + CreditCardInstance.GetCardType());
Console.WriteLine("CreditLimit : " + CreditCardInstance.GetCreditLimit());
Console.WriteLine("AnnualCharge :" + CreditCardInstance.GetAnnualCharge());
}
else
{
Console.Write("Invalid Card Type");
} Console.Read();

参考资料:Factory Method Design Pattern in C#

相比较来讲,此示例更贴近实际的业务开发及逻辑,有助于理解工厂模式在业务开发中的应用。

工厂模式-C#改良实现的更多相关文章

  1. Java设计模式(一) 简单工厂模式不简单

    摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...

  2. IOC的实现原理—反射与工厂模式的结合

    反射机制概念   我们考虑一个场景,如果我们在程序运行时,一个对象想要检视自己所拥有的成员属性,该如何操作?再考虑另一个场景,如果我们想要在运行期获得某个类的Class信息如它的属性.构造方法.一般方 ...

  3. C++ 深入浅出工厂模式(进阶篇)

    介绍 前文初始篇C++ 深入浅出工厂模式(初始篇),主要阐述了简单工厂模式.工厂方法模式和抽象工厂模式的结构.特点和缺陷等.以上三种方式,在新增产品时,要么修改工厂类,要么需新增具体的工厂类,说明工厂 ...

  4. 23种设计模式--工厂模式-Factory Pattern

    一.工厂模式的介绍       工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例 ...

  5. javascript工厂模式和构造函数模式创建对象

    一.工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在JavaScript 中的实现).考虑到在ECMAScript 中无法创 ...

  6. PHP设计模式(三)抽象工厂模式(Abstract Factory For PHP)

    一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...

  7. PHP设计模式(一)简单工厂模式 (Simple Factory For PHP)

    最近天气变化无常,身为程序猿的寡人!~终究难耐天气的挑战,病倒了,果然,程序猿还需多保养自己的身体,有句话这么说:一生只有两件事能报复你:不够努力的辜负和过度消耗身体的后患.话不多说,开始吧. 一.什 ...

  8. 设计模式之工厂模式VS抽象工厂

    一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...

  9. 菜鸟理解的工厂模式(Factory Pattern)是什么样子的?

    直接开始说了,不浪费园友宝贵的时间! 什么是工厂模式? 在学习前,先问一下:"它是什么?". 工厂模式,它是项目里面常用的设计模式之一. 它是属于创建型模式,简单的理解创建型模式就 ...

随机推荐

  1. 基于Quartz.NET框架的任务计划管理工具

    最近接到一个小需求 ——可以定期同步20个Sql Server 7.0数据库里的数据(数据量会预计>10000),并保存为CSV格式文件 ——可以设置保存文件数据量 ——该应用需要用WinFor ...

  2. CSS自定义默认样式

    html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, ...

  3. 快速理解spark-on-k8s中的external-shuffle-service

    [摘要] external-shuffle-service是Spark里面一个重要的特性,有了它后,executor可以在不同的stage阶段动态改变数量,大大提升集群资源利用率.但是这个特性当前在k ...

  4. iPhone唯一标识符

    为了区分iPhone设备,就要用到iPhone的唯一标识符唯一标识符包括:UDID(唯一设备标识符).identifierForVendor(供应商标识符).advertisingIdentifier ...

  5. CodeForces1000A-Light It Up

    B. Light It Up time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  6. 洛谷 题解 P2645 【斯诺克】

    吐槽一下这道题: 数据太水了!!! 请注意,这题如果你考虑了犯规的情况,那么你的分数...可能会和我一样,只有40分. 也就是说,这是一篇AC不了这道题的题解!!! 现在,我来讲一下这道题的正解: 两 ...

  7. 使用chole创建一个连接池

    using Chloe; using Chloe.Infrastructure; using Chloe.SqlServer; using System; using System.Collectio ...

  8. Web 前端学习大纲

    什么是前端? 前端即网站前台部分,也叫前端开发,运行在PC端,移动端等浏览器上展现给用户浏览的网页.随着互联网的发展,HTML5,CSS3,前端框架的应用,跨平台响应式网页设计能够适应各种屏幕分辨率, ...

  9. 【前端知乎系列】ArrayBuffer 和 Blob 对象

    本文首发在 个人博客 更多丰富的前端学习资料,可以查看我的 Github: <Leo-JavaScript>,内容涵盖数据结构与算法.HTTP.Hybrid.面试题.React.Angul ...

  10. 在VS2017中连接到SQLite数据源(dbfist)

    在VS2017中配置.连接到SQLite数据源(dbfist) 需要安装的VS插件 SQLite/SQL Server Compact ToolBox 这个插件安装后,在选择数据源时已经可以选择SQL ...