软件的可维护性与可复用性
软件的可维护性与可复用性软件的可维护性与可复用性 模式模式: 模式,即 Pattern。事实上确实是解决某一类问题的方法论。把解决某类问题的方法总结归 纳到理论高度,那确实是模式。Alexander 给出的经典定义是:每个模式都描述了一个在我们 的环境中不断显现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你能够许多次 地使用那些已有的解决方案, 无需再重复相同的工作。 模式有不同的领域, 建筑领域有建筑模式, 软件设计领域也有设计模式。当一个领域逐步成熟的时候,自然会显现专门多模式。 设计模式和面向对象的设计模式设计模式和面向对象的设计模式: : 设计模式〔Design pattern〕是一套被反复使用、多数人知晓的、通过分类编目的、代码 设计体会的总结。使用设计模式是为了可重用代码、让代码更容易被他人明白得、保证代码可靠 性。设计模式最初来源于建筑学。GOF〔〝四人帮〞,指 Gamma, Helm, Johnson namespace DesignPatterns.Creational { // 测试程序 class MainApp { public static void Main() { // 抽象工厂 1 AbstractFactory factory1 = new ConcreteFactory1(); Client c1 = new Client(factory1); c1.Run(); // 抽象工厂 2 AbstractFactory factory2 = new ConcreteFactory2(); Client c2 = new Client(factory2); c2.Run(); // 等候用户输入 Console.Read(); } } // 抽象工厂 abstract class AbstractFactory { public abstract AbstractProductA CreateProductA(); public abstract AbstractProductB CreateProductB(); } // 具体工厂 1 class ConcreteFactory1 : AbstractFactory { public override AbstractProductA CreateProductA() { return new ProductA1(); } public override AbstractProductB CreateProductB() { return new ProductB1(); } } // 具体工厂 2 class ConcreteFactory2 : AbstractFactory { public override AbstractProductA CreateProductA() { return new ProductA2(); } public override AbstractProductB CreateProductB() { return new ProductB2(); } } // 抽象产品 A,产品族中一个成员 abstract class AbstractProductA { } // 抽象产品 B,产品族中一个成员 abstract class AbstractProductB { public abstract void Interact(AbstractProductA a); } // 具体产品 A1 class ProductA1 : AbstractProductA { } // 具体产品 B1 class ProductB1 : AbstractProductB { public override void Interact(AbstractProductA a) { Console.WriteLine(this.GetType().Name + “ interacts with “ + a.GetType().Name); } } // 具体产品 A2 class ProductA2 : AbstractProductA { } // 具体产品 B2 class ProductB2 : AbstractProductB { public override void Interact(AbstractProductA a) { Console.WriteLine(this.GetType().Name + “ interacts with “ + a.GetType().Name); } } // 客户端,使用环境 class Client { private AbstractProductA AbstractProductA; private AbstractProductB AbstractProductB; // 构造,注意通过构造传入抽象工厂 public Client(AbstractFactory factory) { AbstractProductB = factory.CreateProductB(); AbstractProductA = factory.CreateProductA(); } public void Run() { AbstractProductB.Interact(AbstractProductA); } } } 输出结果为: ProductB1 interacts with ProductA1 ProductB2 interacts with ProductA2 生活中的实例: 那个生活中的实例代码演示了一个电脑游戏, 在游戏中建立不同的动物世界会使用不同的工 厂。尽管创建动物的大陆工厂是不同的,然而动物之间的相互关系保持不变。 Real world code using Abstract Factory in C# using System; namespace DesignPatterns.Creational.AbstractFactory.RealWorld { class MainApp { public static void Main() { // 创建非洲大陆 ContinentFactory africa = new AfricaFactory(); AnimalWorld world = new AnimalWorld(africa); world.RunFoodChain(); // 创建美洲大陆 ContinentFactory america = new AmericaFactory(); world = new AnimalWorld(america); world.RunFoodChain(); // 等待用户输入 Console.ReadKey(); } } // 抽象工厂 abstract class ContinentFactory { // 创建食草动物 public abstract Herbivore CreateHerbivore(); // 创建食肉动物 public ab