1)结构图:
2)代码:
/// 抽象工厂 public interface IFactory { /// <summary></summary> Product FactoryMethod(); } /// 抽象产品类 public abstract class Product { public virtual void show() { Console.Write("I'm product"); } } /// 工厂A public class FactoryA : IFactory { /// <summary></summary> public Product FactoryMethod() { return new ProductA(); } } /// 工厂B public class FactoryB : IFactory { /// <summary></summary> public Product FactoryMethod() { return new ProductB(); } } /// 产品A public class ProductA : Product { public override void show() { Console.Write("I'm productA"); } } /// 产品B public class ProductB : Product { public override void show() { Console.Write("I'm productB"); } } class Program { static void Main(string[] args) { IFactory factory = new FactoryA(); //控制具体要哪个产品 Product product = factory.FactoryMethod(); product.show(); Console.ReadLine(); } }
3)
优点: 工厂方法使得一个类的实例化延迟到其子类.
适用: 客户端的加工逻辑只需要知道是哪类产品,而不需知道具体的产品名.这样不同的产品就可以复用相同的加工逻辑.
1)结构图:
2)代码:
/// <summary> /// 抽象工厂 /// </summary> public interface IAbstractFactory { /// <summary></summary> AbstractProductA CreateProductA(); /// <summary></summary> AbstractProductB CreateProductB(); } /// 工厂1 public class Factory1 : IAbstractFactory { /// 生产系列1的A产品 public AbstractProductA CreateProductA() { return new ProductA1(); } /// 生产系列1的B产品 public AbstractProductB CreateProductB() { return new ProductB1(); } } /// 工厂2 public class Factory2 : IAbstractFactory { /// 生产系列2的A产品 public AbstractProductA CreateProductA() { return new ProductA2(); } /// 生产系列2的B产品 public AbstractProductB CreateProductB() { return new ProductB2(); } } /// 抽象A产品 public abstract class AbstractProductA { } /// 系列1的A产品 public class ProductA1 : AbstractProductA { } /// 系列2的A产品 public class ProductA2 : AbstractProductA { } /// 抽象B产品 public abstract class AbstractProductB { } /// 系列1的B产品 public class ProductB1 : AbstractProductB { } /// 系列2的B产品 public class ProductB2 : AbstractProductB { } class Program { static void Main(string[] args) { IAbstractFactory factory = new Factory1(); //控制生成哪个系列的产品 AbstractProductA productA = factory.CreateProductA(); AbstractProductB productB = factory.CreateProductB(); //TODO.. Console.ReadLine(); } }
3)
优点: 与工厂方法类似
适用: 适合那些客户端的操作逻辑与具体哪一系列产品无关的操作,她隔离了系列产品的创建和产品操作逻辑.所以可以使得不同系列的产品复用相同的操作逻辑.
tips: 可以用反射注入,这样在换系列产品的时候无需修改客户端代码.
1)简介: 通过一个构造器接口,让子类去实现具体的构造方法和逻辑,利用构造器接口去向客户端屏蔽目标对象具体的构造过程.同时,可以通过添加新的构造者去添加产生不同构造的目标对象(由于面向接口编程,所以客户端不知道这一变化).
2)结构图:
3)代码:
/// 构造者接口 public interface IBuilder { /// <summary></summary> void BuildPart1(); /// <summary></summary> void BuildPart2(); /// <summary></summary> void BuildPart3(); /// <summary></summary> Product GetProduct(); } /// 具体构造者A,即含不同的构造逻辑 public class BuilderA : IBuilder { //组合Product,实现对Product的不同部分的构造 private Product _product; public BuilderA() { _product = new Product(); } /// 对Part1进行逻辑操作 public void BuildPart1() { //TODO _product.Part1 = new object(); } /// <summary></summary> public void BuildPart2() { //TODO } /// <summary></summary> public void BuildPart3() { //TODO } /// <summary></summary> public Product GetProduct() { return _product; } } /// 具体构造者B,即含不同的构造逻辑 public class BuilderB : IBuilder { //组合Product,实现对Product的不同部分的构造 private Product _product; public BuilderB() { _product = new Product(); } /// 对Part1进行逻辑操作 public void BuildPart1() { //TODO _product.Part1 = new object(); } /// <summary></summary> public void BuildPart2() { //TODO } /// <summary></summary> public void BuildPart3() { //TODO } /// <summary></summary> public Product GetProduct() { return _product; } } /// 目标产品 public class Product { public object Part1 { get; set; } public object Part2 { get; set; } public object Part3 { get; set; } } /// 控制着构造者构造Product的过程,同时起到对客户端隔离了Product的构造过程. public class Manager { /// 根据不同的Builder来构造 public void Construct(IBuilder builder) { builder.BuildPart1(); builder.BuildPart2(); builder.BuildPart3(); //这里还可以控制构造Product的部分,比如构造其中的某几个部分 } } class Program { static void Main(string[] args) { Manager manager = new Manager(); IBuilder bA = new BuilderA(); IBuilder bB = new BuilderB(); //根据要求不同要求去构造Product manager.Construct(bA); Product pA = bA.GetProduct(); manager.Construct(bB); Product pB = bB.GetProduct(); //TODO.. Console.ReadLine(); } }
4)
适用: 适用于目标对象构造比较复杂,或者构造过程可能变化的时候.
1)简介:
用一个原型类的实例去创建一个新的对象,这个新的对象是由原实例对象拷贝过来的(相当于将原对象复制一份生成)
2)结构图:
3)代码:
/// 原型 public abstract class Prototype { //tips:抽象类也是有构造函数的,因为他要被人继承,其子类实例化过程也是和普通类一样,先从最根处向下实例化 public Prototype(string member) { this.member1 = member; } protected string member1; /// <summary></summary> public abstract Prototype Clone(); } /// 原型A public class PrototypeA : Prototype { protected string member2; public string Member2 { get { return member2;} } public PrototypeA(string member1,string member2) : base(member1) { this.member2 = member2; } /// 克隆实例对象自身(包括父类) public override Prototype Clone() { //C#的话可以采用这种浅复制 return (Prototype)this.MemberwiseClone(); //若是其他语言没有类似语言则先new个对象,再将值赋进去,然后return这个对象 } } /// 原型B public class PrototypeB : Prototype { /// <summary></summary> public override Prototype Clone() { } } /// 原型AA public class PrototypeAA : PrototypeA { protected string member3; public string Member3 { get { return member3; } } public PrototypeAA(string member1, string member2, string member3) : base(member1, member2) { this.member3 = member3; } /// /// 克隆实例对象自身(包括父类) public override Prototype Clone() { //C#的话可以采用这种浅复制 return (Prototype)this.MemberwiseClone(); //若是其他语言没有类似语言则先new个对象,再将值赋进去,然后return这个对象 } } class Program { static void Main(string[] args) { PrototypeA PA = new PrototypeA("m1", "m2"); PrototypeA PA2 = (PrototypeA)PA.Clone(); Console.Write(PA2.Member2); PrototypeAA PAA = new PrototypeAA("m1", "m2", "m3"); PrototypeAA PAA2 = (PrototypeAA)PAA.Clone(); Console.Write(PAA2.Member3); //TODO Console.ReadLine(); } }
4)适用:
适用于需要生成的对象具有父类实例对象的特性(着重点在于是实例对象,即运行时对象),即想让生成对象要具有和某一对象相同的属性,则可考虑采用原型模式(通常需要目标类是原类的子类或后代且都拥有Clone方法,后代重写Clone方法去复制自身对象实例)
1)简介:
保证一个类仅有一个实例,并提供一个访问它的全局访问点.为了保证实例对象的唯一性,让类自身负责保存它的唯一实例.通常做法是1.私有化类构造方法(隔离外部访问) 2.提供一个公共的静态化生成实例方法(保证有唯一访问点)
2)结构图:
3)代码:
/// 单例 class Singleton { private static Singleton _instance; private Singleton() { } public static Singleton GetInstance(){ return _instance == null ? _instance=new Singleton() : _instance; } } class Program { static void Main(string[] args) { Singleton s1 = Singleton.GetInstance(); Singleton s2 = Singleton.GetInstance(); //生成实例是同一个 Console.Write(s1 == s2); //TODO Console.ReadLine(); } }
4)适用:
要求某个类在全局条件下只生成一个实例对象.