设计模式-工厂模式-程序员宅基地

技术标签: 数据库  设计模式  

Design Patterns


工厂模式

工厂模式,定义一个创建对象的接口,让子类决定实现哪一个类
使一个类的实例化延迟到其子类

/// <summary>
/// Factory Pattern
/// 工厂模式,定义一个创建对象的接口,让子类决定实现哪一个类
/// 使一个类的实例化延迟到其子类
/// 简单工厂模式不符合开放封闭原则,即对拓展开放,对修改封闭
/// </summary>
namespace _02_FactoryPattern
{
    /// <summary>
    /// Opreation Class 运算类
    /// </summary>
    class Operation
    {
        private double _optionA;
        private double _optionB;
        public double OptionA
        {
            get { return _optionA; }
            set { _optionA = value; }
        }
        public double OptionB
        {
            get { return _optionB; }
            set { _optionB = value; }
        }
        /// <summary>
        /// Calculations
        /// </summary>
        public virtual double GetResult()
        {
            double result = 0;
            return result;
        }
    }

    /// <summary>
    /// Addtion Class
    /// </summary>
    class OperationAdd : Operation
    {
        public override double GetResult()
        {
            double result = OptionA + OptionB;
            return result;
        }
    }
    /// <summary>
    /// Sub Class
    /// </summary>
    class OperationSub : Operation
    {
        public override double GetResult()
        {
            double result = 0;
            result =  OptionA - OptionB;
            return result;
        }
    }

    /// <summary>
    /// Factory Interface
    /// </summary>
    interface IFactory
    {
        Operation CreateOperation();
    }

    /// <summary>
    /// Add Factory
    /// </summary>
    class AddFactory : IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationAdd();
        }
    }

    /// <summary>
    /// Sub Factory
    /// </summary>
    class SubFactory : IFactory
    {
        public Operation CreateOperation()
        {
            return new OperationSub();
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            //生成一个减的工厂
            IFactory factory = new SubFactory();
            //拿到这个工厂的实例
            Operation oper = factory.CreateOperation();
            //计算
            oper.OptionA = 1;
            oper.OptionB = 3;
            double result = oper.GetResult();

            WriteLine(result.ToString());
            ReadKey();
        }
    }
}

 

抽象工厂模式

提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类

/// <summary>
/// 抽象工厂模式
/// 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类
/// </summary>
namespace _04_AbstractFactoryPattern
{
    /// <summary>
    /// 用户类
    /// </summary>
    class User
    {
        private int _id;
        private string _name;

        public int Id { get => _id; set => _id = value; }
        public string Name { get => _name; set => _name = value; }
    }

    /// <summary>
    /// IUser接口,用于客户端的访问,解除与具体数据库访问的耦合
    /// </summary>
    interface IUser
    {
        void Insert(User user);
        User GetUser(int id);
    }

    /// <summary>
    /// Sql Server类
    /// </summary>
    class SqlServerUser : IUser
    {
        public void Insert(User user)
        {
            Console.WriteLine("在Sql Server数据库中添加了一个user");
        }

        public User GetUser(int id)
        {
            Console.WriteLine("在Sql Server数据库中根据ID拿到了一个User");
            return null;
        }
    }

    /// <summary>
    /// 修改程序为Access数据库访问
    /// </summary>
    class AccessUser : IUser
    {
        public void Insert(User user)
        {
            Console.WriteLine("Access数据库中添加了一个user");
        }

        public User GetUser(int id)
        {
            Console.WriteLine("Access数据库中根据ID拿到了一个User");
            return null;
        }

    }

    interface IFactory
    {
        IUser CreaterUser();
    }

    class SqlFactory : IFactory
    {
        public IUser CreaterUser()
        {
            return new SqlServerUser();
        }
    }

    class AccessFactory : IFactory
    {
        public IUser CreaterUser()
        {
            return new AccessUser();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            User user = new User();
            IFactory factory = new AccessFactory();
            IUser iUser = factory.CreaterUser();

            iUser.Insert(user);
            iUser.GetUser(1);

            Console.ReadKey();
        }
    }
}

  

转载于:https://www.cnblogs.com/AbstractLee/p/8621705.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34015566/article/details/93672700

智能推荐

SpringBoot与RocketMQ客户端集成原理解读与示例-程序员宅基地

文章浏览阅读280次。本文将对rocktmq-spring-boot的设计实现做一个简单的介绍,读者可以通过本文了解将RocketMQ Client端集成为spring-boot-starter框架的开发细节,然后通过一个简单的示例来一步一步的讲解如何使用这个spring-boot-starter工具包来配置,发送和消费RocketMQ消息。该项目git地址:https://..._springboot rocketmq的原理

XAMPP中Apache安装SSL证书(Windows Server)_xampp ssl-程序员宅基地

文章浏览阅读3.1k次。什么是SSL证书?SSL证书是一种数字签证,遵从SSL协议,对服务器身份和传输的数据进行加密,使访问更加安全可靠。大家现在访问的所有网站都会使用Https协议,其实就是在Http外边加了一个SSL的外壳,使数据更加安全,同时浏览器可以根据SSL证书来显示网站是否安全等等,谷歌,火狐等浏览器都会在网址的前边提醒用户是否是安全连接。安装完SSL证书就可以用Https进行访问网站了。一般生成证书会选..._xampp ssl

padding的使用-程序员宅基地

文章浏览阅读198次。2019独角兽企业重金招聘Python工程师标准>>> ..._padding只能加给block吗?

android SDK安装代理设置-程序员宅基地

文章浏览阅读496次。 听说google earth 没经China gev的允许而拍摄到了其军事基地(据说就是2012中的诺亚方舟的建造基地),所以将google赶出了China。进而屏蔽google的一些重要IP地址。android SDK 的下载地址便成了本次政治博弈的牺牲品。大陆的developer无法通过正常的方式安装SDK,必须要进行代理地址设置才可以。具体状况如下:运行SDK Setup.exe后会..._sdk安装要代理吗

嵌入式 uboot通过CMD_LINE传参给kernel以及kernel启动分析_uboot kernel command line-程序员宅基地

文章浏览阅读4.7k次。Linux内核在启动的时候需要一些参数,以获得当前硬件的信息或者启动所需资源在内存中的位置等等。这些信息可以通过bootloader传递给内核,比较常见的就是cmdline。以前我在启动内核的时候习惯性的通过uboot传递一个cmdline给内核,没有具体的分析这个过程。最近在分析内核启动过程的时候,重新看了一下内核启动参数的传递过程,彻底解决一下在这方面的疑惑。 一、bootloader_uboot kernel command line

[maya学习笔记(20)] 约束_maya约束-程序员宅基地

文章浏览阅读1.5w次,点赞4次,收藏25次。目标约束 用一个物体的位移属性,去控制另一个物体的旋转。 先点中约束物体,点击shifit,在选择被约束物体,然后在约束菜单中选择目标。 选中保持偏移,其余保持默认,然后添加。这样就成功了。 (中心点:默认在圆锥中心) 按insert键,可以移动中心点。方向约束_maya约束

随便推点

MISRA C指导指南解读系列7(MISRA C规则68-86) _一个函数在最后应该有一个单一的退出点-程序员宅基地

文章浏览阅读1.5k次。 2.1. 函数68.函数的声明应该是在文件的范围内(R) 例如 void myfunc(void) { extern int call(void); /* 违反规则68 */} 69.函数不能使用可变参数格式的样式(_一个函数在最后应该有一个单一的退出点

云计算学习入门:互操作性与可移植性讲解-程序员宅基地

文章浏览阅读509次。不同于传统的位于单位组织内部的 IT 基础设施,云计算的诞生给单位组织的 IT 资源供给带来了前所未有的灵活性——可以瞬时增加、转移或者减少计算资源来快速响应动态的资源需求变化,能在几个小时而不是几周内部署一个新的应用来满足业务需求。为了达到这种更具弹性的计算能力,在设计任何云系统时必须要考虑互操作性与可移植性。互操作性规定,IT 系统中应用软件层以下各层采用开放的通用型组件,杜绝使用云服务提供商各自内部的封闭组件。可移植性规定,IT 系统中应用软件层和数据信息层应采用开放的通用数据格式..

译:6.RabbitMQ Java Client 之 Remote procedure call (RPC,远程过程调用)-程序员宅基地

文章浏览阅读50次。在译:2. RabbitMQ 之Work Queues (工作队列) 我们学习了如何使用工作队列在多个工作人员之间分配耗时的任务。但是如果我们需要在远程计算机上运行一个函数并等待结果呢?嗯,这是一个不同的故事。此模式通常称为远程过程调用或RPC。在本教程中,我们将使用RabbitMQ构建RPC系统:客户端和可伸缩的RPC服务器。由于我们没有任何值得分发的耗时任务,我们将创建..._fibonaccirpc.call("30");

【libuv高效编程】libuv学习超详细教程6 ——libuv check 检查句柄解读_libuv example-程序员宅基地

文章浏览阅读1.6k次。check handle可以被译为检查句柄,如果程序中启动了check handle后,在事件循环中,每当I/O循环退出阻塞的时候都会被执行一遍,它与prepare刚好是相互呼应的,prepare是在I/O循环进入阻塞前,check是在I/O循环退出阻塞后被调用。_libuv example

BZOJ 2384: [Ceoi2011]Match KMP+树状数组-程序员宅基地

文章浏览阅读118次。这道题是 KMP 来转移子串中的相对排名. 然后查询排名的话需要用到树状数组. 如果跳 fail 指针的话要把没用元素全部删掉. code:#include <bits/stdc++.h> #define N 1005000 #define setI(s) freopen(s".in","r",stdin) using name..._bzoj2384

diskgenius创建efi分区_怎么创建efi系统分区?efi系统分区创建教程-程序员宅基地

文章浏览阅读7.7k次。[文章导读]近两年出来的的电脑不管是新台式机还是笔记本电脑,绝大多数是uefi主板,要采用对应的硬盘分区是gpt格式的,所以我们一定要记得采用efi引导对应的分区类型一定是gpt分区,EFI分区是GPT磁盘分区表里面的一个必要分区,是独立于系统之外的分区,即使系统崩溃了,里面的文件也不会丢失,它的格式可以是FAT16/FAT32两种,前者速度更快后者支持的文件大小可以接近4GB。当然除非有特殊情况..._diskgenius创建efi分区

推荐文章

热门文章

相关标签