23种设计模式UML 类图及对应示例代码(一) 收藏1.DoFactory.GangOfFour.Abstract.StructuralAbstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
工厂模式:客户类和工厂类分开。
消费者任何时候需要某种产品,只需向工厂请求即可。
消费者无须修改就可以接纳新产品。
缺点是当产品修改时,工厂类也要做相应的修改。
如:如何创建及如何向客户端提供。
using System;namespace DoFactory.GangOfFour.Abstract.Structural{///<summary>/// MainApp startup class for Structural/// Abstract Factory Design Pattern.///</summary>class MainApp{///<summary>/// Entry point into console application.///</summary>public static void Main(){// Abstract factory #1AbstractFactory factory1 = new ConcreteFactory1(); Client client1 = new Client(factory1);client1.Run();// Abstract factory #2AbstractFactory factory2 = new ConcreteFactory2(); Client client2 = new Client(factory2);client2.Run();// Wait for user inputConsole.Read();}}// "AbstractFactory"abstract class AbstractFactory{public abstract AbstractProductA CreateProductA();public abstract AbstractProductB CreateProductB(); }// "ConcreteFactory1"class ConcreteFactory1 : AbstractFactory{public override AbstractProductA CreateProductA() {return new ProductA1();}public override AbstractProductB CreateProductB(){return new ProductB1();}}// "ConcreteFactory2"class ConcreteFactory2 : AbstractFactory{public override AbstractProductA CreateProductA() {return new ProductA2();}public override AbstractProductB CreateProductB() {return new ProductB2();}}// "AbstractProductA"abstract class AbstractProductA{}// "AbstractProductB"abstract class AbstractProductB{public abstract void Interact(AbstractProductA a); }// "ProductA1"class ProductA1 : AbstractProductA{}// "ProductB1"class ProductB1 : AbstractProductB{public override void Interact(AbstractProductA a) {Console.WriteLine(this.GetType().Name +" interacts with " + a.GetType().Name);}}// "ProductA2"class ProductA2 : AbstractProductA{}// "ProductB2"class ProductB2 : AbstractProductB{public override void Interact(AbstractProductA a){Console.WriteLine(this.GetType().Name +" interacts with " + a.GetType().Name);}}// "Client" - the interaction environment of the productsclass Client{private AbstractProductA AbstractProductA;private AbstractProductB AbstractProductB;// Constructorpublic Client(AbstractFactory factory){AbstractProductB = factory.CreateProductB();AbstractProductA = factory.CreateProductA();}public void Run(){AbstractProductB.Interact(AbstractProductA);}}}2.DoFactory.GangOfFour.Adapter.StructuralAdapter:将一个类的接口转换成客户希望的另一个接口,使得原来由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器(变压器)模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。
适配类可以根据参数返还一个合适的实例给客户端。
using System;namespace DoFactory.GangOfFour.Adapter.Structural{///<summary>/// MainApp startup class for Structural/// Adapter Design Pattern.///</summary>class MainApp{///<summary>/// Entry point into console application.///</summary>static void Main(){// Create adapter and place a requestTarget target = new Adapter();target.Request();// Wait for userConsole.Read();}}// "Target"class Target{public virtual void Request(){Console.WriteLine("Called Target Request()");}}// "Adapter"class Adapter : Target{private Adaptee adaptee = new Adaptee();public override void Request(){// Possibly do some other work// and then call SpecificRequestadaptee.SpecificRequest();}}// "Adaptee"class Adaptee{public void SpecificRequest(){Console.WriteLine("Called SpecificRequest()");}}}3.DoFactory.GangOfFour.Bridge.StructuralBridge:将抽象部分与它的实现部分分离,使之可以独立变化。
桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。
using System;namespace DoFactory.GangOfFour.Bridge.Structural {///<summary>/// MainApp startup class for Structural/// Bridge Design Pattern.///</summary>class MainApp{///<summary>/// Entry point into console application.///</summary>static void Main(){Abstraction ab = new RefinedAbstraction();// Set implementation and callab.Implementor = new ConcreteImplementorA(); ab.Operation();// Change implemention and callab.Implementor = new ConcreteImplementorB(); ab.Operation();// Wait for userConsole.Read();}}// "Abstraction"class Abstraction{protected Implementor implementor;// Propertypublic Implementor Implementor{set{ implementor = value; }}public virtual void Operation(){implementor.Operation();}}// "Implementor"abstract class Implementor{public abstract void Operation();}// "RefinedAbstraction"class RefinedAbstraction : Abstraction{public override void Operation(){implementor.Operation();}}// "ConcreteImplementorA"class ConcreteImplementorA : Implementor{public override void Operation(){Console.WriteLine("ConcreteImplementorA Operation");}}// "ConcreteImplementorB"class ConcreteImplementorB : Implementor{public override void Operation(){Console.WriteLine("ConcreteImplementorB Operation");}}}4.DoFactory.GangOfFour.Builder.StructuralBuilder:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。