public static Singleton1 GetInstance() { // 当第一个线程运行到这里时,此时会对locker对象 "加锁", // 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁 // lock语句运行完之后(即线程运行完之后)会对该对象"解锁" //lock (locker) //{ // if (s1_instance == null) // { // s1_instance = new Singleton1(); // } //} /* * 上面代码对于每个线程都会对线程辅助对象locker加锁之后再判断实例是否存在, * 对于这个操作完全没有必要的,因为当第一个线程创建了该类的实例之后,后面的线程此时只需要直接判断(uniqueInstance==null)为假, * 此时完全没必要对线程辅助对象加锁之后再去判断,所以上面的实现方式增加了额外的开销,损失了性能,为了改进上面实现方式的缺陷, * 我们只需要在lock语句前面加一句(uniqueInstance==null)的判断就可以避免锁所增加的额外开销,这种实现方式我们就叫它 “双重锁定(Double Check) */ if (s1_instance == null) { lock (locker) { ///这边的为空不能去掉,:两个线程进入了第一判断(if (uniqueInstance == null)),但是在Lock语句以前,这时,只有一个线程能进去执行,创建实例,Lock语句结束了执行,就会释放锁, ///这时语句还没执行完,因为现在还在第一个判断的方法内,如果里面没有那个判断,第二个线程立刻又能获得锁,又会创建一个实例,所以两个为空的判断都不能去掉。 ///相当于两个为空都是为了保证该类只能有一个实例 if (s1_instance == null) { s1_instance = new Singleton1(); } } } return(s1_instance); }
static void Main(string[] args) { //Console.BackgroundColor = ConsoleColor.Blue; 设置控制台颜色 //Console.ForegroundColor=ConsoleColor.White; #region 单例模式(Singleton Pattern)【创建型】 //单线程中的单例模式 var instance = Singleton.GetInstance(); Console.WriteLine(instance.GetInfo()); //多线程中的单例模式 var instance1 = Singleton1.GetInstance(); Console.WriteLine(instance1.GetInfo("无敌")); var s2 = Singleton1.GetInstance(); Console.WriteLine(); Console.WriteLine(); #region 线程中调用 ///ParameterizedThreadStart委托是允许传参数的,ThreadStart表示无参 /// //t2线程的实例 Thread t2 = new Thread(new ThreadStart(() => { })); Thread t1 = new Thread(new ParameterizedThreadStart((object obj) => { var s1 = Singleton1.GetInstance(); //Thread.Sleep(5000); Console.WriteLine(s1.GetInfo("我是t1线程的")); })); Thread t2 = new Thread(() => { var ss2 = Singleton1.GetInstance(); Console.WriteLine(ss2.GetInfo("我是t2线程的")); // Console.WriteLine("我是t2线程的" + ss2.GetInfo()); }); Thread t3 = new Thread(() => { var ss3 = Singleton1.GetInstance(); // Console.WriteLine("我是t2线程的" + ss2.GetInfo()); }); t1.Start(null); t2.Start(); t3.Start(); #endregion #endregion #region 设计模式原则_依赖倒置原则测试 Animal animal = new Animal(); var d_say = animal.GetSayThing(new Dog()); var f_say = animal.GetSayThing(new Fish()); Console.WriteLine(d_say); Console.WriteLine(f_say); Console.WriteLine(); Console.WriteLine(); #endregion #region 工厂模式(Factory Method Pattern)【创建型】 HQ_CarFactory hq_fact = new HQ_CarFactory(); Car hq_car = hq_fact.ProductCar(); Car hq_car1 = hq_fact.ProductCar(); hq_car.Go(); hq_car1.Go(); Console.WriteLine("生产日期:" + hq_fact.GetProductDate()); Console.WriteLine("将要去往" + hq_car.GoTo("北京")); BC_CarFactory bc_fact = new BC_CarFactory(); Car bc_car = bc_fact.ProductCar(); bc_car.Go(); Console.WriteLine("生产日期:" + hq_fact.GetProductDate()); Console.WriteLine("将要去往" + hq_car.GoTo("上海")); Console.WriteLine(); Console.WriteLine(); #endregion #region 建造模式(Build Pattern)【创建型】 CarDirector director = new CarDirector(); //指导者 BmwBuild bmw_builder = new BmwBuild(); //具体建造者--继承抽象建造者 director.Construct(bmw_builder); // 构造一个使用Builder接口的对象即在指导者的调用下创建产品实例 BCar baoma = bmw_builder.GetCar(); //具体产品 baoma.show(); var BcBuilder = new BenChiBuild(); director.Construct(BcBuilder); var benchi = BcBuilder.GetCar(); benchi.show(); Console.WriteLine(); Console.WriteLine(); #endregion #region 原型模式中的深浅clone CopyClass c1 = new CopyClass(); c1.i = 5; c1.str = "我是原对象"; CopyClass c2 = c1.Clone1(); CopyClass c3 = c1.Clone2(); Console.WriteLine("原对象中的i={0},浅副本的i={1},深副本的i={2} ", c1.i, c2.i, c3.i); Console.WriteLine("原对象中的str={0},浅副本的str={1},深副本的str={2} ", c1.str, c2.str, c3.str); Console.WriteLine("修改原对象中i后"); c1.i = 10; c1.str = "我是修改后的原对象"; c1.arr[0] = 10; Console.WriteLine("原对象中的i={0},浅副本的i={1},深副本的i={2} ", c1.i, c2.i, c3.i); Console.WriteLine("原对象中的str={0},浅副本的str={1},深副本的str={2} ", c1.str, c2.str, c3.str); Console.WriteLine("原对象中的数组第一位={0},浅副本的数组第一位={1},深副本的数组第一位={2} ", c1.arr[0], c2.arr[0], c3.arr[0]); //上述三次修改的记录中只有 数组的修改,导致浅副本中的数组跟着修改 //有人说值类型的属性不会修改,引用类型的属性会修改,但是string好像是个特例不能修改 Console.WriteLine(); Console.WriteLine(); #endregion #region 适配器模式(Adapter Pattern)【结构型】 ITwoHoleTarget twohole = new ThreeToTwoAdapter(); twohole.Reqest(); ITwoHoleTarget_1 twohole_1 = new ThreeToToAdapter_1(); twohole_1.Request(); Console.WriteLine(); Console.WriteLine(); #endregion #region 桥接模式(Bridge Pattern)【结构型】 PlatformImplementor SqlServer2000UinxImp = new SQLServer2000UnixImplementor(); DataBase SqlServer2000Unix = new SQLServer2000(SqlServer2000UinxImp); SqlServer2000Unix.Create(); Console.WriteLine(); Console.WriteLine(); #endregion #region 装饰模式(Decorator Pattern)【结构型】 House huageHouse = new HugeFengeGHouse(); AirConditionerDecorator airCond = new AirConditionerDecorator(huageHouse); airCond.Renovation(); #region C#中的具体实现 Stream a = new MemoryStream(); BufferedStream bs = new BufferedStream(a); #endregion Console.WriteLine(); Console.WriteLine(); #endregion #region 外观模式(Facade Pattern)【结构型】 F_Facade facade = new F_Facade(); facade.Method_C(); Console.WriteLine(); Console.WriteLine(); #endregion #region 代理模式(Proxy Pattern)【结构型】 AgentPerson agentperson = new AgentPerson(); agentperson.Speak("李小璐出轨。。。。"); Console.WriteLine(); Console.WriteLine(); #endregion #region 模板方法模式(Template Method Pattern)【行为型】 ConcreteClass jiaozi = new ConcreteClass(); jiaozi.EatingJiaoZi();//子类中new覆盖的吃饺子的方法 Console.WriteLine(); //这个才是模板方法模式的实现,上面的是覆盖的介绍 AbstractClass jz = new ConcreteClass(); jz.EatingJiaoZi();//父类中的吃饺子的方法 Console.WriteLine(); Console.WriteLine(); #endregion #region 命令模式(Command Pattern)【行为型】 HuaAndWife worker = new HuaAndWife(); GMCommand command = new MakeDumplingCommand(worker); PaPaInoker papa = new PaPaInoker(command); papa.ExecuteCommand(); Console.WriteLine(); Console.WriteLine(); #endregion #region 迭代器模式(Iterator Pattern)【行为型】 ConcreteTroopQueue troopqueue = new ConcreteTroopQueue(); I_Iterator iterator = troopqueue.GetIterator(); //I_Iterator iterator = new ConcreteIterator(troopqueue);//上面那个方式初始化,比这个好() try { while (iterator.MoveText()) { Console.WriteLine(iterator.GetCurrent()); //iterator.Next(); } } finally { iterator.Reset(); Console.WriteLine("游标重置了。。。"); } Console.WriteLine("流程结束"); Console.WriteLine(); Console.WriteLine(); #endregion #region 观察者模式(Observer Pattern)【行为型】 //观察者模式(Observer Pattern)【行为型】 BankMessageSystem nanjingBankSystem = new NanJingBankMessageSystem(); Depositor zhangs = new NanJingDepositor("zhangs", 4000); Depositor lisi = new NanJingDepositor("lisi", 3000); Depositor wangw = new NanJingDepositor("wangw", 2000); nanjingBankSystem.Add(zhangs); nanjingBankSystem.Add(lisi); nanjingBankSystem.Add(wangw); zhangs.GetMoney(500); nanjingBankSystem.Notify(); #region 个List比较,看看变化单个list会不会变化 int i1 = 5; int i2 = 6; int i3 = 7; List <int> ll = new List <int>(); ll.Add(i1); ll.Add(i2); ll.Add(i3); i1 = 5 - 3; foreach (var l in ll) { //if (l < 5) Console.WriteLine(l);//这边没变 } Huage h_zhangs = new Huage("zhangs", 18, false); Huage h_lisi = new Huage("lisi", 19, false); Huage h_wangw = new Huage("wangw", 20, false); List <Huage> h_list = new List <Huage>(); h_list.Add(h_zhangs); h_list.Add(h_lisi); h_list.Add(h_wangw); h_zhangs.Age = 20; h_zhangs.Sex = true; h_lisi.Name = "SB_lisi"; h_lisi.Sex = true; foreach (var h in h_list) { if (h.Sex) { Console.WriteLine(h.Name + ":您的信息变了"); } } // (这边应该适用于引用类型,不适用于值类型,但是引用类型的string也要除外) 这边list.add()方法只是添加的该对象的内存地址,如果该对象变了,但是内存地址没变,所以list也会因对象的改变而改变。。 // 可以查看 ‘原型模式中的深浅clone’ 的学习 string s_str1 = "huage1"; string s_str2 = "huage2"; string s_str3 = "huage3"; List <string> s_list = new List <string>(); s_list.Add(s_str1); s_list.Add(s_str2); s_list.Add(s_str3); s_str1 = "zhangs"; foreach (var s in s_list) { Console.WriteLine(s);//没有变。。。 } #endregion Console.WriteLine(); Console.WriteLine(); #endregion #region 中介者模式(Mediator Pattern)【行为型】 President pre = new President(); Development development = new Development(pre); Financial financial = new Financial(pre); pre.SetDevelopment(development); //pre.SetFinancial(financial); pre.Command(); Console.WriteLine(); Console.WriteLine(); #endregion #region 状态模式(State Pattern)【行为型】 Order order = new Order(); order.Minute = 20; order.Action(); Console.WriteLine("**********************************"); order.Minute = 21; order.IsCancel = true; order.SetState(new WaitForAcceptance()); order.Action(); Console.WriteLine(); Console.WriteLine(); #endregion #region 策略模式(Stragety Pattern)【行为型】 SalaryContext context = new SalaryContext(new NormalPeopleSalary()); context.GetSalary(1000.00); context.Salary = new ProgrammerSalary(); context.GetSalary(5000.00); context.Salary = new CEOSalary(); context.GetSalary(10000.00); Console.WriteLine(); Console.WriteLine(); #endregion #region 职责链模式(Chain of Responsibility Pattern)【行为型】 PurchaseRequest requestJiaJu = new PurchaseRequest(1000, "家具"); PurchaseRequest requestConputer = new PurchaseRequest(50000, "联想笔记本"); PurchaseRequest requestCar = new PurchaseRequest(100000, "大众汽车"); Approver manager = new Manger("部门经理_zhangs"); Approver finmanager = new FinancialManager("财务经理_lisi"); Approver ceo = new CEO("总裁_zhanghua"); manager.ProcessRequest(requestJiaJu); finmanager.NextApprover = ceo; finmanager.ProcessRequest(requestCar); ceo.ProcessRequest(requestConputer); manager.NextApprover = finmanager; finmanager.NextApprover = ceo; manager.ProcessRequest(requestCar); Console.WriteLine(); Console.WriteLine(); #endregion #region 访问者模式(Visitor Pattern)【行为型】 ShapeVisitor visitor = new CustomVisitor(); AppStructure app = new AppStructure(visitor); Shape shape = new Rectangle(); shape.Draw(); //执行自己的操作 app.Process(shape); //执行新的操作 //shape.Accept(visitor); #endregion #region 备忘录模式(Memento Pattern)【行为型】 //这边需要理解一下,堆栈,值类型存放于堆中,引用类型存放于栈中 List <ContactPerson> listCP = new List <ContactPerson>() { new ContactPerson() { Name = "zhangs", MobileNum = "123" }, new ContactPerson() { Name = "lisi", MobileNum = "456" }, new ContactPerson() { Name = "wangw", MobileNum = "789" } }; //手机名单发起人 MobileBackOriginator mbOriginator = new MobileBackOriginator(listCP); mbOriginator.Show(); //创建被弯路并保存备忘录对象 MementoManager memntoManager = new MementoManager(); memntoManager.ContactPersonMemento = mbOriginator.CreateMemento(); //更改发起人联系人列表 Console.WriteLine("--------删除最后一位联系人--------"); mbOriginator.List.RemoveAt(mbOriginator.List.Count - 1); mbOriginator.Show(); //恢复到原始状态 Console.WriteLine("--------恢复到原始状态--------"); mbOriginator.RestoreMemento(memntoManager.ContactPersonMemento); mbOriginator.Show(); Console.WriteLine(); Console.WriteLine(); #endregion Console.ReadKey(); }