一:工厂模式
- 目的:定义一个创建对象的接口,让其子类决定实例化哪个工厂类,工厂模式使其常见对象的过程延迟到子类进行
- 主要解决:主要解决接口选择问题
- 如何解决:让其子类实现工厂接口,返回的也是一个抽象产品
- 关键代码:创建过程在其子类执行
- 应用实例:您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
- **优点: **1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。
- 缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖,这并不是什么好事。
- 注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
实现
/// <summary>
/// 生产PC的工厂接口
/// </summary>
public interface PC
{
void Make();
}
/// <summary>
/// 生产Phone的工厂接口
/// </summary>
public interface Phone
{
void Make();
}
/// <summary>
/// 总工厂 (抽象工厂模式)
/// </summary>
public interface AbstractFactory
{
Phone MakePhone();
PC MakePC();
}
/// <summary>
/// 小米生产PC的工厂
/// </summary>
public class MIPc : PC
{
public MIPc()
{
this.Make();
}
public void Make()
{
Console.WriteLine("小米PC");
}
}
/// <summary>
/// 小米生产Phone的工厂
/// </summary>
public class MiPhone:Phone
{
public MiPhone()
{
this.Make();
}
public void Make()
{
Console.WriteLine("小米Phone");
}
}
/// <summary>
/// 苹果生产PC的工厂
/// </summary>
public class MAC : PC
{
public MAC()
{
this.Make();
}
public void Make()
{
Console.WriteLine("苹果PC");
}
}
/// <summary>
/// 苹果生产iPone的工厂
/// </summary>
public class iPhone : Phone
{
public iPhone()
{
this.Make();
}
public void Make()
{
Console.WriteLine("苹果iPhone");
}
}
/// <summary>
/// 小米工厂(生产手机pc)
/// </summary>
public class XiaoMiFactory : AbstractFactory
{
public PC MakePC()
{
return new MIPc();
}
public Phone MakePhone()
{
return new MiPhone();
}
}
/// <summary>
/// 苹果工厂(生产手机pc)
/// </summary>
public class AppleFactory : AbstractFactory
{
public PC MakePC()
{
return new MAC();
}
public Phone MakePhone()
{
return new iPhone();
}
}
- *运行结果 *
二:观察者模式
- 解释: 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
- 目的: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
- 主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。
- 何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
- 如何解决::使用面向对象技术,可以将这种依赖关系弱化。
- 关键代码:使用事件通知观察者们。
- 应用实例:1、拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。 2、西游记里面悟空请求菩萨降服红孩儿,菩萨洒了一地水招来一个老乌龟,这个乌龟就是观察者,他观察菩萨洒水这个动作。
- 优点:1、观察者和被观察者是抽象耦合的。2、建立一套触发机制。
- 缺点:1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
-
使用场景:
- 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
- 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
- 一个对象必须通知其他对象,而并不知道这些对象是谁。
- 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。
- 实现:
/// <summary>
/// 烧水壶类 (烧水壶烧水行为,烧水时温度计温度上升,用电量增加)
/// </summary>
public class ShaoShuiHu
{
public delegate void ShaoShuiDele();
public event ShaoShuiDele ShaoShuiEvt;
public void BoilWater()
{
if (ShaoShuiEvt!=null)
{
Console.WriteLine("电水壶 开始烧水。。。。");
ShaoShuiEvt();
}
}
}
/// <summary>
/// 温度计类
/// </summary>
public class Thermometer
{
//升温
public void ShengWen()
{
Console.WriteLine("温度正在升高!");
}
}
/// <summary>
/// 电表
/// </summary>
public class Meter
{
//用电
public void UseElectric()
{
Console.WriteLine("正在用电,用电量正在增加");
}
}
-
运行结果:
原文链接:https://www.runoob.com/design-pattern/design-pattern-tutorial.html