软件设计师23种设计模式总结
1. Abstract Factory (抽象匸厂)
提供一个创建一系列相关或互相依赖对象的接口,而无须制定它们具体的类。
图10-25抽象工厂模式结构图
Abstract Factory 抽象工厂
class Program
{
static void Main(string[] args)
{
AbstractFactory factoryl 二new Con creteFactoryl():
Clie nt cl 二new Clie nt (factoryl):
cl. Ru n();
AbstractFactory factory2 二new Con ereteFactory2();
Clie nt c2 二new Clie nt(factory2):
c2. Ru n();
Co nsole? Read();
abstract class AbstractFactory
public abstract AbstractProductA CreateProductA(); public abstract AbstractProductB CreateProductBO ; '
class ConcreteFactoryl : AbstractFactorv
{
public override AbstractProductA CreatePtoductA()
{
return new ProductAl();
}
public override AbstractProductB CreateProductB()
{
return new ProductBl();
class ConcreteFactory2 : AbstractFactory
{
public override AbstractProductA CreateProductA()
{
return new ProductA2();
)
public override AbstractProductB CreateProductB()
{
return new ProductB2();
abstract class AbstractProductA abstract class AbstractProductB
{
public abstract void Interact(AbstractProductA a);
class ProductAl : AbstractPtoductA class ProductBl : AbstractProductB
{
public override void Interact(AbstractProductA a)
{
Console? WriteLine(this? GetType()? Name +
,z interacts with " + a. GetType (). Name);
class ProductA2 : AbstractProductA
class ProductB2 : AbstractProductB
public override void Interact(AbstractProductA a) (
Console? WriteLine(this? GetType(). Name + 〃interacts with " + & GetType(). Name): }
}
class Client
(
private AbstractProductA AbstractProductA;
private AbstractProductB AbstractPtoductB;
// Constructor
public Client(AbstractFactory factory)
(
AbstractProductB 二factory. CreateProductBO; AbstractProductA 二factory. CreateProductA();
}
public void Run()
AbstractProductB. Interact(AbstractProductA);
}
}
2.Builder (生成器)将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
图10-26生成器模式结构图
Builder 生成器
class Program
{
static void Main(string[] args) {
Director director 二 new Director 。; Builder bl = new ConcreteBuilderl(); Builder b2 二 new Con ereteBuilder2();
director. C on struet(b2); Product p2 = b2.GetResult(); p2. Show():
Co nsole. Read(); } }
class Director {
public void Con struct(Builder builder) { builder. BuildPartA();
builder. BuildPartB(); }
} abstract class Builder
Directo r
Construct!)
T
C
for all objects in structure
buildcr^BuildPartO
builder O' —
director. C on struet (bl);
Product pl =bl. GetResult () pl. Show();
public abstract void BuildPartA(); public abstract void Bu订dPartB ();
public abstract Product GetResult();
class ConcreteBuilderl : Builder
{
private Product product 二new Product();
public override void BuildPartA()
{
product. AddC'部件A");
}
public override void BuildPartB()
{
product. Add(z/部件B");
}
public override Product GetResult()
{
return product;
}
class ConcreteBuilder2 : Builder
{
private Product product 二new Product(); public override void
BuildPartA()
product. Add(z/部件X");
}
public override void BuildPartB()
{
product. AddC'部件Y");
}
public override Product GetResult()
{
return product;
}
class Product
{
IList〈string> parts 二new List〈string>();
public void Add(string part)
parts. Add (part);
public void Show()
Console. Write Line C\n产品仓U 建“);foreach (stri ng par t
in parts)
{
Con sole.WriteL in e (part);
}
}
}
3.Factory Method(工厂方法)
定义一个用于创建对象的接口,让子类决定实例化哪一个类。
Factory Method使一个实例化延迟到其子类。
图10-27工厂方法模式结构图
Factory Method I]厂方法
class Program
{
static void Main(string[] args)
{
//
//基本方式:薛磊风代表大学生学习雷锋
LeiFe ng xueleife ng 二new Un dergraduate();
xueleife ng. BuyRiceO ;
xueleife ng. Sweep ();
xueleife ng. WashO ;
LeiFe ng stude ntl 二new Un dergraduate() ; stude ntl?
BuyRice ();
LeiFe ng stude nt2 二new Un dergraduate () ; stude nt2. Sweep
();
LeiFe ng stude nt3 二new Un dergraduate ();
student3? Wash ();
//简单工厂模式
LeiFeng studentA = SimpleFactory. CreateLeiFeng C学雷锋的大学生");
studentA? BuyRice();
LeiFeng studentB = SimpleFactory. CreateLeiFengC 学雷锋的大学生”);
studentB. Sweep ();
LeiFeng studentC 二SimpleFactory. CreateLeiFeng(学雷锋的大学生");
studentC. WashO ;
//工厂方法模式
IFactory factory 二new UndergraduateFactory();
LeiFeng student 二factory. CreateLeiFeng();
student. BuyRice ();
student. Sweep ();
student. WashO ;
Console. Read ();
}
)