桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式。
主要意图:将抽象部分与实现部分分离,使它们都可以独立的变化。
主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。
解决方案:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。
优点:
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、对于"具体的抽象类"所做的改变,是不会影响到客户。