博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
抽象工厂模式
阅读量:6090 次
发布时间:2019-06-20

本文共 2237 字,大约阅读时间需要 7 分钟。

  hot3.png

工厂模式作为创建型的设计模式,主要是控制调用者对实例的创建,而抽象则是将依赖实现改变为依赖接口。

依赖,发现很多人不明白这个词的含义,简单说,就是实例对象后引用的类型,一个简单对象:User user = new User();

这时依赖是对象自己,如果User继承BaseUser并实现了IOperate接口,这时可依赖的对象有三个,除了自身之外,还有接口和父类。

在抽象工厂还是其它设计模式中,按设计模式Solid原则,要依赖的最好是接口而不是具体的实现!

这里的抽象工厂也是,即我们定义一个方法是最好先定义一个接口,来实现这个接口的方法。调用时就可以依赖这个接口来实现。

这样实现了相同接口的类可以依赖共同的引用,实现了对象的多样性。

看代码:

public interface ICarOperate    {        void GetCar();    }    public abstract class Car    {        public static readonly Dictionary
cars = new Dictionary
(); } public class BMW : Car, ICarOperate { private static readonly BMW instance = new BMW(); public void GetCar() { WriteLine("BMW"); } public static ICarOperate GetInstance() { ICarOperate result = null; string key = string.Empty; try { key = string.Format("{0}", instance.GetType()); if (!cars.ContainsKey(key)) { cars.Add(key, instance); } result = cars[key]; } catch (Exception ex) { WriteLine("{0}", ex.Message); } return result; } } public class Benz : Car, ICarOperate { private static readonly Benz instance = new Benz(); public void GetCar() { WriteLine("Benz"); } public static ICarOperate GetInstance() { ICarOperate result = null; string key = string.Empty; key = string.Format("{0}", instance.GetType()); if (!cars.ContainsKey(key)) { cars.Add(key, instance); } result = cars[key]; return result; } } public class Test { public static void Run() { ICarOperate car = BMW.GetInstance(); car.GetCar(); car = Benz.GetInstance(); car.GetCar(); } }

在Test类中的Run方法里调用,相同的依赖,传入不同的实例后getCar出来的内容是不相同的。而且使用GetInstance方法来调用父类中的字典,在以后同样类型的子对象生成时永远只会保存一份实例,这样就可以极大节约内存的开销。当然这样做在多线程情况下,由于线程同步的安全要求,会比较慢,因为一个线程使用时,会处于锁定状态,其它线程无法访问。安全性是没问题,性能受了一点影响,毕竟有取舍。

转载于:https://my.oschina.net/cnyy/blog/2998223

你可能感兴趣的文章
unsigned 后面不跟类型的情况
查看>>
QT按键(Qbutton)改变颜色
查看>>
less学习笔记三
查看>>
git stash 怎么用?
查看>>
shell输出加颜色
查看>>
非root Android设备上Tcpdump的实现
查看>>
mysql之多表查询的其他查询
查看>>
一个popup弹窗实现思路--(基于mintui分析)
查看>>
手写一个WPF-MVVM
查看>>
系统组件:警告对话框AlertDialog(1)
查看>>
jquery下removeClass(“oldClassName”).addClass("newClassName")的问题
查看>>
uwsgi ini 设置
查看>>
CF994B Knights of a Polygonal Table 第一道 贪心 set/multiset的用法
查看>>
archer 安装
查看>>
ORA-01033: ORACLE initialization or shutdown in progress
查看>>
二维指针与二维数组研究
查看>>
hiho一下 第三十九周 归并排序求逆序数
查看>>
Subsets and Subsets II (回溯,DFS,组合问题)
查看>>
go语言中的接口interface
查看>>
iOS 无证书真机调试
查看>>