设计模式学习之路(一):抽象工厂

设计模式学习之路(一):抽象工厂

怎么学?当然是吸取前人的经验,这样学起来快
前人栽树,后人乘凉!!!

先上结构图

以下是整个抽象工厂结构

设计模式学习之路(一):抽象工厂

以此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();
上一篇:blob 导出 content-type 类型


下一篇:Python爬虫之爬取B站视频(哔哩哔哩)