设计模式-工厂模式

设计模式-工厂模式

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101756.html原文链接:https://javaforall.net

(0)
上一篇 2021年5月25日 上午10:00
下一篇 2021年5月25日 上午11:00


相关推荐

  • 设计模式(6)之七大原则之迪米特原则

    设计模式(6)之七大原则之迪米特原则一 定义迪米特法则 LawofDemeter LoD 又叫作最少知识原则 LeastKnowled LKP 产生于 1987 年美国东北大学 Northeastern 的一个名为迪米特 Demeter 的研究项目 由伊恩 荷兰 IanHolland 提出 被 UML 创始者之一的布奇 Booch 普及 后来又因为在经典著作 程序员修炼之道 ThePragmatic 提及而广为人知 一个类应该对其他保持

    2026年3月18日
    2
  • 设计模式 – 结构型设计模式 – 适配器模式(Java)

    设计模式 – 结构型设计模式 – 适配器模式(Java)分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.netDefinitionSeparatetheconstructionofacomplexobjectfromitsrepresentationsothatthesameconstructionprocesscan…

    2022年7月25日
    14
  • 设计模式(九)外观模式Facade(结构型)

    设计模式(九)外观模式Facade(结构型)设计模式外观模式 Facade 结构型 1 概述外观模式 我们通过外观的包装 使应用程序只能看到外观对象 而不会看到具体的细节对象 这样无疑会降低应用程序的复杂度 并且提高了程序的可维护性 例子 1 一个电源总开关可以控制四盏灯 一个风扇 一台空调和一台电视机的启动和关闭 该电源总开关可以同时控制上述所有电器设备 电源总开关即为该系统的外观模式设计 2

    2026年3月26日
    2
  • 设计模式之责任链模式(职责链模式)

    设计模式之责任链模式(职责链模式)前言在现实生活中 一个事件需要经过多个对象处理是很常见的场景 例如 采购审批流程 请假流程等 公司员工请假 可批假的领导有部门负责人 副总经理 总经理等 但每个领导能批准的天数不同 员工必须根据需要请假的天数去找不同的领导签名 也就是说员工必须记住每个领导的姓名 电话和地址等信息 这无疑增加了难度 在计算机软硬件中也有相关例子 如总线网中数据报传送 每台计算机根据目标地址是否同自己的地址相同来决定是否接收 还有异常处理中 处理程序根据异常的类型决定自己是否处理该异常 还有 Struts2 的拦截器 J

    2026年3月18日
    1
  • [设计模式]委派模式「建议收藏」

    github地址:https://github.com/1711680493点我进入github如需了解更多设计模式,请进入我的设计模式专栏委派模式委派模式不是23设计模式中的一种.与策略模式很相似.拥有以下三种角色抽象任务角色 委派者角色 具体任务角色委派模式,就是将任务发给委派者角色,委派者角色去委派具体任务角色委派模式对外隐藏了具体实现,仅将委派者角色暴露给外部委派模式和策略模式不同的是,委派者角色和具体任务角色都要继承/实现抽象任务角色Spring框架很

    2022年4月16日
    43
  • Carson带你学设计模式:工厂方法模式(Factory Method)

    Carson带你学设计模式:工厂方法模式(Factory Method)手把手带你全面了解工厂方法模式

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号