桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式。
主要意图:将抽象部分与实现部分分离,使它们都可以独立的变化。
主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。
解决方案:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。
优点:
1、抽象和实现的分离。
2、优秀的扩展能力。
3、实现细节对客户透明。
缺点:
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
桥接模式类图:
代码实现:
基础版:
using System; namespace _03单例模式_基础版 { class Program { static void Main(string[] args) { Singleton s1 = Singleton.GetInstance(); Singleton s2 = Singleton.GetInstance(); if (s1==s2) { Console.WriteLine("两个对象是相同的实例。"); } Console.Read(); } } class Singleton { private static Singleton instance; private Singleton() { } public static Singleton GetInstance() { if (instance==null) { instance = new Singleton(); } return instance; } } }
多线程版:
using System; namespace _04单例模式_多线程版 { class Program { static void Main(string[] args) { Singleton s1 = Singleton.GetInstance(); Singleton s2 = Singleton.GetInstance(); if (s1 == s2) { Console.WriteLine("两个对象是相同的实例。"); } Console.Read(); } } class Singleton { private static Singleton instance; private static readonly object syncRoot = new object(); private Singleton() { } public static Singleton GetInstance() { if (instance==null) { lock (syncRoot) { if (instance == null) { instance = new Singleton(); } } } return instance; } } }
静态初始化版:
using System; namespace _05单例模式_静态初始化 { class Program { static void Main(string[] args) { Singleton s1 = Singleton.GetInstance(); Singleton s2 = Singleton.GetInstance(); if (s1 == s2) { Console.WriteLine("两个对象是相同的实例。"); } Console.Read(); } } public sealed class Singleton { private static readonly Singleton instance = new Singleton(); private Singleton() { } public static Singleton GetInstance() { return instance; } } }
总结:
1、桥接模式实现了抽象化与实现化的脱耦。他们两个互相独立,不会影响到对方。
2、对于两个独立变化的维度,使用桥接模式再适合不过了。
3、对于"具体的抽象类"所做的改变,是不会影响到客户。