抽象工厂模式之我用

news/2024/7/3 12:39:54

我们关注的内容:

1 使用场景分析

2 案例代码解析

一 使用场景分析

抽象工厂模式,为创建一组相关或项目依赖的对象提供一个接口,而且无需指定他们具体的类。抽象工厂模式的通用类图如下:

image

通俗的来讲:拥有共同的属性和方法体,但是具体的实现内容不同,即可使用抽象工厂模式。

二 案例代码解析

案例场景:B2C电子商务的支付系统,一个电子商城需要集成不同方式的支付系统,比如支付宝,网银在线,paypal等,他们共同的特点是需要用户提供用户资料,支付完成之后反馈给系统一个状态或数据。

具体实现图如下:

image

先创建一个支付的抽象类AbstractPay:

public abstract class AbstractPay
    {
        /// <summary>
        /// 生成支付链接
        /// </summary>
        /// <returns></returns>
        public abstract string Pay();
        /// <summary>
        /// 支付完成之后对支付结果进行记录
        /// </summary>
        /// <returns></returns>
        public abstract string PayResutl();
    }
根据支付需求,产生不同实现的支付方式,支付宝实现Zhifubao:
public class Zhifubao:AbstractPay
    {
        public override string Pay()
        {
            string result = "zhifubao.com";
            return result.ToString();
        }
        public override string PayResutl()
        {
            return "支付宝成功支付!";
        }
    }

网银在线实现BankOnLine:

public class BankOnLine : AbstractPay
    {
        public override string Pay()
        {
            string result = "bankonline.com";
            return result.ToString();
        }
        public override string PayResutl()
        {
            return "网银在线成功支付!";
        }
    }
现在开始创建这个工厂,具体代码如下:
public abstract class PayFactory
    {

        public static Zhifubao CreateZhifubao()
        {
            return new Zhifubao();
        }
        public static BankOnLine CreateBankOnLine()
        {
            return new BankOnLine();
        }
    }

客户端调用如下:

            AbstractPay zfb = PayFactory.CreateZhifubao();
            Console.WriteLine(zfb.Pay());
            Console.WriteLine(zfb.PayResutl());

            AbstractPay oline = PayFactory.CreateBankOnLine();
            Console.WriteLine(oline.Pay());
            Console.WriteLine(oline.PayResutl());

输出结果图:

image

提升:现在开始思考,如果我新增一个支付方式paypal,该如何做呢?

新增一个paypal类实现:

 public class Paypal: AbstractPay
    {
        public override string Pay()
        {
            string result = "paypal.com";
            return result.ToString();
        }
        public override string PayResutl()
        {
            return "paypal成功支付!";
        }
    }

下面就要修改工厂才能实现,如何不用修改工厂就能实现呢?可以使用反射的原理来实现。将工厂类修改如下:

public abstract class PayFactory
    {
        

        protected static string myAssemblyName = "FactoryTest";
        protected static string Mynamespace = "DesignPattern.";
        public static AbstractPay CreatePay(string ClassName)
        {
            return (AbstractPay)Assembly.Load(myAssemblyName).CreateInstance(Mynamespace + ClassName);
        }
    }

客户端调用如下:

            AbstractPay paypal = PayFactory.CreatePay("Paypal");
            Console.WriteLine(paypal.Pay());
            Console.WriteLine(paypal.PayResutl());
是不是不下次再新增一种支付方式的时候就不用修改工厂类了呢 微笑

欢迎大家一起探讨最佳实现方式!

转载于:https://www.cnblogs.com/wxj200589/archive/2012/02/29/2373164.html


http://www.niftyadmin.cn/n/1123773.html

相关文章

MySQL缓存命中率概述

工作原理&#xff1a; 查询缓存的工作原理&#xff0c;基本上可以概括为&#xff1a; 缓存SELECT操作或预处理查询&#xff08;注释&#xff1a;5.1.17开始支持&#xff09;的结果集和SQL语句&#xff1b; 新的SELECT语句或预处理查询语句&#xff0c;先去查询缓存&#xff0c;…

最简单方法搞定 VirtualBox 虚拟机共享文件问题

太阳先人出品的VirtualBox还算将就&#xff0c;不要钱&#xff0c;不要序列号&#xff0c;不用编译&#xff08;直接rpm搞定&#xff09;。还是中文的&#xff0c;已经算不错老&#xff0c;最起码能解决LINUX下面用XP软件的90&#xff05;问题&#xff0c;和谐和谐两个系统麻&a…

Apache实现反向代理负载均衡

说到负载均衡LVS这套技术&#xff0c;有很多种实现方法。 本文所说&#xff0c;主要就是利用apache服务器实现反向代理&#xff0c;实现负载均衡。 首先&#xff0c;传统的正向代理如下图所示&#xff0c;正如我们用的游戏加速代理&#xff0c;大多的个人PC把请求发给正向代理服…

同济大学高等数学上册电子版_同济大学编高等数学上册第十一页例题几何解法...

这道题是描述这样一个规律&#xff1a;定义域对称的函数f(x),总是能被分解为偶函数g(x)与奇函数h(x)之和。书中使用代数解&#xff0c;很清晰简洁。f(x)f(-x) 肯定是 偶函数&#xff0c;f(x)-f(-x)肯定是奇函数。所以 这个偶函数这个奇函数2f(x);也就能拼出f(x)了(奇偶函数各/2…

获取rpm文件,不安装

2019独角兽企业重金招聘Python工程师标准>>> 比如你要将test.rpm用test.rpm里的某个文件&#xff0c;但你又不想安装test.rpm&#xff0c;那你可以试试这个办法。 随便建一个目录 mkdir aaa 把test.rpm放入目录aaa里并进入aaa目录 cp path/to/test.rpm aaa/ cd aaa …

在Oracle中使用rank()over()排名的问题

排序&#xff1a; ---rank()over(order by 列名 排序)的结果是不连续的&#xff0c;如果有4个人&#xff0c;其中有3个是并列第1名&#xff0c;那么最后的排序结果结果如&#xff1a;1 1 1 4 select scoreid, studentid,COURSENAME,totalexamscore , rank()over(order by TOTAL…

hadoop之mapreduce实例

例子很简单&#xff0c;我没有运行自带的wordcount&#xff0c;而是自己做了一个简单的例子。实现的功能是从我们的nginx的access log里面计算url访问的次数。access log文件&#xff1a;10.2.112.22 - - [11/Apr/2012:10:25:31 0800] "GET /bf5bd91c/css/base/base_jiexi…

fib函数用迭代替换递归

fib函数递归实现&#xff1a; long Fib(long n) {if (n < 1) {return n; }else {var t1 Fib(n - 1);var t2 Fib(n - 2);return t1 t2; } } fib函数改为迭代&#xff1a; class Class1 {class Node …