工厂模式-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)是什么样子的?
直接开始说了,不浪费园友宝贵的时间! 什么是工厂模式? 在学习前,先问一下:"它是什么?". 工厂模式,它是项目里面常用的设计模式之一. 它是属于创建型模式,简单的理解创建型模式就 ...
随机推荐
- 机器学习笔记(九)---- 集成学习(ensemble learning)【华为云技术分享】
集成学习不是一种具体的算法,而是在机器学习中为了提升预测精度而采取的一种或多种策略.其原理是通过构建多个弱监督模型并使用一定策略得到一个更好更全面的强监督模型.集成学习简单的示例图如下: 通过训练得到 ...
- [TimLinux] JavaScript querySelectorAll返回对象无法使用indexOf问题
1. querySelectorAll 该函数返回的对象类型为NodeList,这个类型并没有indexOf方法,如果需要使用indexOf方法,需要先将该对象每一项转存入Array对象中,然后就可以 ...
- CodeForces985F -- Isomorphic Strings
F. Isomorphic Strings time limit per test 3 seconds memory limit per test 256 megabytes input standa ...
- 一款简单的C++猜数字游戏(新手必学)
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:1只小弛 废话不多说,直接上代码! #include<bits/s ...
- ARTS-S gitlab与jenkins实现持续集成
jenkins配制 系统管理->管理插件->可选插件->选择安装 Gitlab Hook Plugin和Build Authorization Token Root Plugin插件 ...
- 使用Spring Boot和AspectJ实现方法跟踪基础结构
了解如何使用Spring Boot和AspectJ实现方法跟踪基础结构!最近在优锐课学习收获颇多,记录下来大家一起进步! 在我们的应用程序中,获取方法的堆栈跟踪信息可能会节省很多时间.具有输入输出参数 ...
- RequireJS 打包工具
r.js是RequireJS的一个附产品,支持在 NodeJS环境下运行AMD程序,并且其包含了一个名为RequireJS Optimizer的工具,可以为项目完成合并脚本等优化操作 RequireJ ...
- 【hibernate】映射可嵌入式组件
[hibernate]映射可嵌入式组件 转载:https://www.cnblogs.com/yangchongxing/p/10376452.html 可嵌入 Address 类,没有对应的数据表 ...
- Scala函数式编程(四)函数式的数据结构 下
前情提要 Scala函数式编程指南(一) 函数式思想介绍 scala函数式编程(二) scala基础语法介绍 Scala函数式编程(三) scala集合和函数 Scala函数式编程(四)函数式的数据结 ...
- 小白的springboot之路(十四)、AOP
0.前言 1.什么是AOP AOP(面向切面编程),是一种横切技术,是对OOP的补充和完善: 使用AOP的横切,可以对系统进行无侵入性的日志监听.事务.权限管理等: 思想上跟拦截器其实类似;拦截器是对 ...