• C# 设计模式


    单例模式

    1、某个对象只需要一个实例的情况;

    2、定义一个静态变量来保存类的实例;

    3、定义私有构造函数,使外界不能创建该类实例;

    4、定义公有方法提供一个全局访问点;

    // 该类不是一个公开类
        // 但是该类的实现应用了单例模式
        internal sealed class SR
        {
            private static SR loader;
            internal SR()
            {
            }
            // 主要是因为该类不是公有,所以这个全部访问点也定义为私有的了
            // 但是思想还是用到了单例模式的思想的
            private static SR GetLoader()
            {
                if (loader == null)
                {
                    SR sr = new SR();
                    Interlocked.CompareExchange<SR>(ref loader, sr, null);
                }
                return loader;
            }
    
            // 这个公有方法中调用了GetLoader方法的
            public static object GetObject(string name)
            {
                SR loader = GetLoader();
                if (loader == null)
                {
                    return null;
                }
                return loader.resources.GetObject(name, Culture);
            }
        }
    View Code

    简单工厂模式

    1、定义一个抽象类,子类根据自我需求实现不同的行为;

    2、定义一个工厂,用户传入参数,根据参数创建不同的对象,返回对象;

    其实是将创建对象的过程汇总到抽象工厂中。

    优点:简单工厂模式实现了对责任的分割。代码的复用。别的地方创建可能还是需要复杂的逻辑判断,减少代码;

    /// <summary>
        /// 顾客充当客户端,负责调用简单工厂来生产对象
        /// 即客户点菜,厨师(相当于简单工厂)负责烧菜(生产的对象)
        /// </summary>
        class Customer
        {
            static void Main(string[] args)
            {
                // 客户想点一个西红柿炒蛋        
                Food food1 = FoodSimpleFactory.CreateFood("西红柿炒蛋");
                food1.Print();
    
                // 客户想点一个土豆肉丝
                Food food2 = FoodSimpleFactory.CreateFood("土豆肉丝");
                food2.Print();
    
                Console.Read();
            }
        }
    
        /// <summary>
        /// 菜抽象类
        /// </summary>
        public abstract class Food
        {
            // 输出点了什么菜
            public abstract void Print();
        }
    
        /// <summary>
        /// 西红柿炒鸡蛋这道菜
        /// </summary>
        public class TomatoScrambledEggs : Food
        {
            public override void Print()
            {
                Console.WriteLine("一份西红柿炒蛋!");
            }
        }
    
        /// <summary>
        /// 土豆肉丝这道菜
        /// </summary>
        public class ShreddedPorkWithPotatoes : Food
        {
            public override void Print()
            {
                Console.WriteLine("一份土豆肉丝");
            }
        }
    
        /// <summary>
        /// 简单工厂类, 负责 炒菜
        /// </summary>
        public class FoodSimpleFactory
        {
            public static Food CreateFood(string type)
            {
                Food food = null;
                if (type.Equals("土豆肉丝"))
                {
                    food= new ShreddedPorkWithPotatoes();
                }
                else if (type.Equals("西红柿炒蛋"))
                {
                    food= new TomatoScrambledEggs();
                }
    
                return food;
            }
        }
    View Code

    工厂方法模式

    1、简单模式缺点:难以扩展工厂创建---扩展导致逻辑判断复杂

    2、工厂类:给出工厂必须实现的接口,创建对相应的工厂;

    namespace 设计模式之工厂方法模式
    {
        /// <summary>
        /// 菜抽象类
        /// </summary>
        public abstract class Food
        {
            // 输出点了什么菜
            public abstract void Print();
        }
    
        /// <summary>
        /// 西红柿炒鸡蛋这道菜
        /// </summary>
        public class TomatoScrambledEggs : Food
        {
            public override void Print()
            {
                Console.WriteLine("西红柿炒蛋好了!");
            }
        }
    
        /// <summary>
        /// 土豆肉丝这道菜
        /// </summary>
        public class ShreddedPorkWithPotatoes : Food
        {
            public override void Print()
            {
                Console.WriteLine("土豆肉丝好了");
            }
        }
    
        /// <summary>
        /// 抽象工厂类
        /// </summary>
        public abstract class Creator
        {
            // 工厂方法
            public abstract Food CreateFoddFactory();
        }
    
        /// <summary>
        /// 西红柿炒蛋工厂类
        /// </summary>
        public class TomatoScrambledEggsFactory:Creator
        {
            /// <summary>
            /// 负责创建西红柿炒蛋这道菜
            /// </summary>
            /// <returns></returns>
            public override Food CreateFoddFactory()
            {
                return new TomatoScrambledEggs();
            }
        }
    
        /// <summary>
        /// 土豆肉丝工厂类
        /// </summary>
        public class ShreddedPorkWithPotatoesFactory:Creator
        {
            /// <summary>
            /// 负责创建土豆肉丝这道菜
            /// </summary>
            /// <returns></returns>
            public override Food CreateFoddFactory()
            {
                return new ShreddedPorkWithPotatoes();
            }
        }
    
        /// <summary>
        /// 客户端调用
        /// </summary>
        class Client
        {
            static void Main(string[] args)
            {
                // 初始化做菜的两个工厂()
                Creator shreddedPorkWithPotatoesFactory = new ShreddedPorkWithPotatoesFactory();
                Creator tomatoScrambledEggsFactory = new TomatoScrambledEggsFactory();
    
                // 开始做西红柿炒蛋
                Food tomatoScrambleEggs = tomatoScrambledEggsFactory.CreateFoddFactory();
                tomatoScrambleEggs.Print();
    
                //开始做土豆肉丝
                Food shreddedPorkWithPotatoes = shreddedPorkWithPotatoesFactory.CreateFoddFactory();
                shreddedPorkWithPotatoes.Print();
    
                Console.Read();
            }
        }  
    }
    View Code

    抽象工厂

    /// <summary>
        /// 如果绝味又想开一家湖南的分店时,因为湖南喜欢吃麻的
        /// 所以这是有需要有一家湖南的工厂专门制作
        /// </summary>
        public class HuNanFactory : AbstractFactory
        {
            // 制作湖南鸭脖
            public override YaBo CreateYaBo()
            {
                return new HuNanYaBo();
            }
    
            // 制作湖南鸭架
            public override YaJia CreateYaJia()
            {
                return new HuNanYajia();
            }
        }
    
        /// <summary>
        /// 湖南的鸭脖
        /// </summary>
        public class HuNanYaBo : YaBo
        {
            public override void Print()
            {
                Console.WriteLine("湖南的鸭脖");
            }
        }
    
        /// <summary>
        /// 湖南的鸭架
        /// </summary>
        public class HuNanYajia : YaJia
        {
            public override void Print()
            {
                Console.WriteLine("湖南的鸭架子");
            }
        }
    View Code

    缺点:抽象工厂模式很难支持新种类产品的变化。这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了“开发——封闭”原则。

  • 相关阅读:
    分布式哈希和一致性哈希算法
    消息队列rabbitmq的五种工作模式(go语言版本)
    Mysql查询缓存
    数据库的三大设计范式
    二叉树的常见算法
    消息队列选型分析
    Mysql防止索引失效原则
    Mysql索引优化单表、两表、三表实践
    数据结构 【栈与队列】
    谷歌实用插件
  • 原文地址:https://www.cnblogs.com/zhlziliaoku/p/9139300.html
Copyright © 2020-2023  润新知