zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    SAP PI 如何实现消息定义查询
    EWM与ERP交互程序
    ITS Mobile Template interpretation failed. Template does not exist
    SAP Material Flow System (MFS) 物料流系统简介
    SAP EWM Table list
    EWM RF 屏幕增强
    SAP EWM TCODE list
    SAP扩展仓库管理(SAPEWM)在线研讨会笔记
    ERP与EWM集成配置ERP端组织架构(二)
    EWM RF(Radio Frequency)简介
  • 原文地址:https://www.cnblogs.com/zhlziliaoku/p/9139300.html
Copyright © 2011-2022 走看看