设计模式学习之路(一):抽象工厂
怎么学?当然是吸取前人的经验,这样学起来快
前人栽树,后人乘凉!!!
先上结构图
以下是整个抽象工厂结构
以此demo为例
调用优点:
腾讯和爱奇艺在调用时只是媒体对象MediaFactory不同,也就是说我们只需要在最开始初始化的时候去new不同的播放工厂,就能灵活自如的切换不同的播放器
管理优点:
将一个系列的产品统一到一起创建
整个系统架构各司其职,简单明了
老板:加个需求,腾讯音频需要加个停止播放的功能
我只能怎么做:
Audio抽象类加个接口Stop
优点:
加起来方便啊,加个接口,实现就完事了,都不需要在意细节(具体现实方式),
弊端:
分别在所有继承了Audio抽象类的里面加入Stop实现,老板只是说加腾讯音频暂停的实现方式啊,并没有让你实现爱奇艺的暂停,可你不得不写(编译器会报错),这就裂开了呀
老板:再加个需求,我们公司最近需要引入直播功能
我只能怎么做:
在MediaFactory抽象类加入新接口LiveBroadcast直播
弊端:
然后此时就必须去修改MediaFactory抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,(某个方面同上需求一样的弊端)需要改动的代码就太多太多了,继续裂开
老板:昂,还有个需求,就是再引入一个优酷播放器
我只能这样做:
创建Youku视频和音频播放类分别继承视频Video、音频Audio,再创建一个Youku工厂类,OK,然后分别去实现,就完事了
这时候优势出来了,可以看到我没有改过原来的代码,只是在新增东西,你原来的代码我也不需要太关注,完美解决老板的问题
总结一下:
代码方面:只要不更改我的抽象类,昂,一切好说,该实现啥实现啥
需求方面:只要不加新的产品、不加新接口一切好说
代码部分
MediaFactory媒体抽象工厂类
/// <summary>
/// 媒体抽象工厂类
/// </summary>
public abstract class MediaFactory
{
/// <summary>
/// 创建音频播放器
/// </summary>
public abstract Audio CreateAudio();
/// <summary>
/// 创建视频播放器
/// </summary>
public abstract Video CreateVideo();
}
Audio音频抽象类
/// <summary>
/// 音频抽象类:提供每一播放器的音频继承
/// </summary>
public abstract class Audio
{
/// <summary>
/// 播放音频
/// </summary>
public abstract void Play();
/// <summary>
/// 暂停音频
/// </summary>
public abstract void Stop();
}
Video视频抽象类
/// <summary>
/// 视频抽象类:提供每一播放器的视频继承
/// </summary>
public abstract class Video
{
/// <summary>
/// 播放视频
/// </summary>
public abstract void Play();
}
TenxuAudio腾讯音频播放器
/// <summary>
/// 腾讯音频播放器
/// </summary>
public class TenxuAudio : Audio
{
public override void Play()
{
Console.WriteLine("腾讯视频开始播放音频...");
}
public override void Stop()
{
Console.WriteLine("腾讯视频暂停播放音频...");
}
}
TenxuVideo 腾讯视频播放器
/// <summary>
/// 腾讯视频播放器
/// </summary>
public class TenxuVideo : Video
{
public override void Play()
{
Console.WriteLine("腾讯视频开始播放视频...");
}
}
AiqiyiVideo 爱奇艺视频播放器
/// <summary>
/// 爱奇艺视频播放器
/// </summary>
public class AiqiyiVideo : Video
{
public override void Play()
{
Console.WriteLine("爱奇艺开始播放视频...");
}
}
AiqiyiAudio 爱奇艺音频播放器
/// <summary>
/// 爱奇艺音频播放器
/// </summary>
public class AiqiyiAudio : Audio
{
public override void Play()
{
Console.WriteLine("爱奇艺开始播放音频...");
}
public override void Stop()
{
Console.WriteLine("暂停播放该功能暂未实现...");
}
}
AiqiyiFactory 爱奇艺工厂
/// <summary>
/// 爱奇艺工厂
/// </summary>
public class AiqiyiFactory : MediaFactory
{
/// <summary>
/// 创建爱奇艺音频播放器
/// </summary>
/// <returns></returns>
public override Audio CreateAudio()
{
return new AiqiyiAudio();
}
/// <summary>
/// 创建爱奇艺视频播放器
/// </summary>
/// <returns></returns>
public override Video CreateVideo()
{
return new AiqiyiVideo();
}
}
TenxuFactory 腾讯工厂
/// <summary>
/// 腾讯工厂
/// </summary>
public class TenxuFactory : MediaFactory
{
/// <summary>
/// 创建腾讯音频播放器
/// </summary>
/// <returns></returns>
public override Audio CreateAudio()
{
return new TenxuAudio();
}
/// <summary>
/// 创建腾讯视频播放器
/// </summary>
/// <returns></returns>
public override Video CreateVideo()
{
return new TenxuVideo();
}
}
最后调用实例
MediaFactory mf = null;
mf = new TenxuFactory();
//mf = new AiqiyiFactory();
//mf = new YoukuFactory();
Video video = mf?.CreateVideo();
video.Play();
Audio audio = mf?.CreateAudio();
audio.Play();
audio.Stop();