工厂模式-C#改良实现
参考了下网上的工厂模式实现,总的来说例子还是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#改良实现的更多相关文章
- Java设计模式(一) 简单工厂模式不简单
摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...
- IOC的实现原理—反射与工厂模式的结合
反射机制概念 我们考虑一个场景,如果我们在程序运行时,一个对象想要检视自己所拥有的成员属性,该如何操作?再考虑另一个场景,如果我们想要在运行期获得某个类的Class信息如它的属性.构造方法.一般方 ...
- C++ 深入浅出工厂模式(进阶篇)
介绍 前文初始篇C++ 深入浅出工厂模式(初始篇),主要阐述了简单工厂模式.工厂方法模式和抽象工厂模式的结构.特点和缺陷等.以上三种方式,在新增产品时,要么修改工厂类,要么需新增具体的工厂类,说明工厂 ...
- 23种设计模式--工厂模式-Factory Pattern
一.工厂模式的介绍 工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例 ...
- javascript工厂模式和构造函数模式创建对象
一.工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在JavaScript 中的实现).考虑到在ECMAScript 中无法创 ...
- PHP设计模式(三)抽象工厂模式(Abstract Factory For PHP)
一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...
- PHP设计模式(一)简单工厂模式 (Simple Factory For PHP)
最近天气变化无常,身为程序猿的寡人!~终究难耐天气的挑战,病倒了,果然,程序猿还需多保养自己的身体,有句话这么说:一生只有两件事能报复你:不够努力的辜负和过度消耗身体的后患.话不多说,开始吧. 一.什 ...
- 设计模式之工厂模式VS抽象工厂
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...
- 菜鸟理解的工厂模式(Factory Pattern)是什么样子的?
直接开始说了,不浪费园友宝贵的时间! 什么是工厂模式? 在学习前,先问一下:"它是什么?". 工厂模式,它是项目里面常用的设计模式之一. 它是属于创建型模式,简单的理解创建型模式就 ...
随机推荐
- .Net Core Web Api使用模型验证验证参数合法性
在接口开发过程中免不了要去验证参数的合法性,模型验证就是帮助我们去验证参数的合法性,我们可以在需要验证的model属性上加上Data Annotations特性后就会自动帮我们在action前去验证输 ...
- Mac 中环境变量的配置
1. 基本了解 1.1. 查看当前path 在讲解Mac环境变量配置之前,大家可以打开dos框,输入 echo $PATH 查看当前的path. 本机结果: /usr/local/bin:/usr/l ...
- Java修炼——对象数组存储表格数据
数组存基本数据类型,也可以存引用数据类型 对象数组:使用数组存储对象(自定义对象) 先定义Person的三个私有变量,给他取值赋值方法,重写toString方法. package com.bjsxt. ...
- webpack(四) --css样式及图片打包
一.CSS样式打包 1. loader简介 由于Webpack打包入口目前只配置了一个index.js文件,那么其他需要被打包的文件都必须通过模块化方式引入该文件才行,而默认情况下,引入的文件必须是j ...
- Yii2框架那些折磨人的坑
说点闲话 距离上次写博客,已经有一年了.在动手写之前,总是带着深深的罪恶感.被它折磨许久,终于,还是,动手了. 值得庆祝的一件事:最近开始健身了.每天动感单车45分钟,游泳45分钟,真的是(生)爽(不 ...
- JSP+Servlet 实现:理财产品信息管理系统
一.接业务,作分析 1.大致业务要求 1.1 使用 JSP+Servlet 实现理财产品信息管理系统,MySQL5.5 作为后台数据库,实现查看理财 和增加理财功能 1.2 查询页面效果图 1.3 添 ...
- 如何用css画一个文件上传图案?
如下图,如果是你,你会怎么实现: 通常我们会通过字体图标来显示中间的加号,外层用一个div包裹即可:或者使用伪元素来模拟中间的一横一竖,这都比较麻烦. 其实我们可以直接使用div+css就可以实现. ...
- docker入门-安装篇
一.docker介绍 1:docker官网 www.docker.com 2:github https://github.com/docker/docker.github.io 3:开源的容器引擎, ...
- JAVA 使用jgit管理git仓库
最近设计基于gitops新的CICD方案,需要通过java读写git仓库,这里简单记录下. JGit是一款pure java的软件包,可以读写git仓库,下面介绍基本使用. 引入jgit maven引 ...
- webpack学习_资源管理(loader)
webpack 最出色的功能之一就是,除了 JavaScript,还可以通过 loader 引入任何其他类型的文件 引入资源步骤 Step1:安装你需要的loader Step2:在 module配 ...