首页 数据库 mysql教程 抽象工厂――设计模式

抽象工厂――设计模式

Jun 07, 2016 pm 03:05 PM
了解 工厂 抽象 模式 设计 设计模式

一、了解 抽象 工厂 设计 模式 书上说:提供一个创建一系列相关或相互依赖对象的接口,而无需制定他们具体的类。 二、看类图 解说员:图上分两部分来看,一部分是左边的IFactory家族,另一部分是右边的IProduct 家族。 1、先看IProduct家族。 第一层:客户需

一、了解抽象工厂设计模式

书上说:提供一个创建一系列相关或相互依赖对象的接口,而无需制定他们具体的类。

 

二、看类图
抽象工厂――设计模式

 

解说员:图上分两部分来看,一部分是左边的IFactory家族,另一部分是右边的IProduct 家族。

 

1、先看IProduct家族。

 

第一层:客户需求。可以看出我们需要哪些产品,由客户端决定,我们需要提前设计好第二层的产品。

 

第二层:ProductA和ProductB,这一系列的产品,具体要根据实际情况来确定。

第二层要说明的是:这个具体的产品的属性是不变的,而我们要对这个产品进行的各种操作是变化的,为了符合开放——封闭,和封装原则,在修改方法的时候不必影响到属性,我们把这个产品类分成了两部分,一部分是具体的名词类,不包含任何方法,只有该类的属性;另一部分是抽象接口:定义对该类的操作方法。这样我们就可以单独的对一个类的属性或者是方法进行分别操作,而互不影响,做到面向对象的封装。他们之间是依赖关系,接口依赖具体类。这个内部关系,在上图中没有变现出来。
抽象工厂――设计模式

 

也就是说,第三层实现的是第二层的接口方法,访问和操作的是第二层的具体类。

 

第三层:A1,A2,则是具体的实现类了。他们是ProductA 的具体实现过程。可能实现有多种,SO,具体的实现类也要多个,当然也需要一个统一的接口来统一管理。这里的接口就设在了第二层,有力第二层的接口,我们就可以在三层进行扩展,这也是一个封装。

 

体现的原则

开放——封闭原则:对扩展开放,对修改封闭。

在这个三层图上,有两个接口,也就是有两个地方可能发生变化,一个是数据库的选择,一个是访问数据库表的选择。

 

依赖倒转原则:抽象工厂设计是由上自下逐步抽象的,且是针对接口编程,在最后一层才开始考虑具体的实现,提高了代码的复用,分别体现了:高层模块不依赖低层模块;抽象不依赖细节。

 

单一原则:第三层的每个类都是对单一功能的实现,对一个数据库表进行访问。

 

 

举例说明:用户需要访问数据库,那第二层就是数据库表,这些是哪个数据库都具备的;从第一层到二层扩展为了将来对更多或者其他数据库表的访问;现在我们要访问用户表,或许以后,我们还需要访问公司部门表,或者公司财务表;第三层应该考虑数据库的具体访问,操作实现,可扩展的子类有SQL server,Access 或者oracle。这些都是不同的实现过称,但同属于实现这一级别。可能现在用的是access,将来用SQL server,或者是Oracle,所以我们在要第二层为什么准备了接口,以备第三层的多种实现。

 

 

 

2、看IFactory家族。

 

此处工厂不是具体的制造产品的工厂,只是一个中介所。为什么这么说?

 

第一层:定义了一个创建一系列相关或相互依赖对象的接口。

例如我们需要访问的多个数据库表都在其中定义。这也是区别于工厂模式的一点。工厂模式针对的是一类,而抽象工厂针对的是一系列产品。

 

第二层:具体实现访问方法,他们根据客户端实例化的对象,帮助用户找到Iproduct 家族中第三层的地址,达到实现的目的。

 练手:对SQL server和ACCESS两种数据库中的用户表和部门表进行访问。

[csharp]  

//定义用户表类——定义了用户表的属性  

  

        class User  

  

        {  

  

            private int id;  

  

            public int ID  

  

            {  

  

                get { return id; }  

  

                set { id = value; }  

  

            }  

  

            private string name;  

  

            public string Name  

  

            {  

  

                get { return name; }  

  

                set { name = value; }  

  

            }  

  

        }  

  

        //定义数据库用户表接口——定义了对用户表的进行的操作  

  

        interface IUser  

  

        {  

  

            void Insert(User user);  

  

            User GetUser(int id);  

  

        }  

  

        //定义SQL数据库表  

  

        class SqlserverUser:IUser  

  

        {  

  

            public void Insert(User user)  

  

            {  

  

                Console.WriteLine("在SQL 中增加一条用户记录");  

  

            }  

  

            public User GetUser(int id)  

  

            {  

  

                Console.WriteLine("在SQL 中根据ID得到一条用户记录");  

  

                return null;  

  

            }  

  

        }  

  

        //定义Access数据库表  

  

        class AccessUser : IUser  

  

        {  

  

            public void Insert(User user)  

  

            {  

  

                Console.WriteLine("在Access 中增加一条用户记录");  

  

            }  

  

            public User GetUser(int id)  

  

            {  

  

                Console.WriteLine("在Access 中根据ID得到一条用户记录");  

  

                return null;  

  

            }  

  

        }  

  

   

  

        //定义数据库部门表——属性  

  

        class Department  

  

        {  

  

            private int id;  

  

            public int ID  

  

            {  

  

                get { return id; }  

  

                set { id = value; }  

  

            }  

  

            private string dname;  

  

            public string DName  

  

            {  

  

                get { return dname; }  

  

                set { dname = value; }  

  

            }  

  

        }  

  

        //定义操作部门的接口——操作  

  

        interface IDepartmnet  

  

        {  

  

            void Insert(Department department);  

  

            Department GetDepartment(int id);  

  

        }  

  

        //定义用于访问部门的SQL 实现  

  

        class SQLdepartment:IDepartmnet   

  

        {  

  

            public void Insert(Department department)  

  

            {  

  

                Console.WriteLine("在SQL 中插入一条记录!");  

  

            }  

  

            public Department GetDepartment(int id)  

  

            {  

  

                Console.WriteLine("根据ID 号取出部门!");  

  

                return null;  

  

            }  

  

        }  

  

   

  

        //定义用于访问部门的Access 实现  

  

        class Accessdepartment : IDepartmnet  

  

        {  

  

            public void Insert(Department department)  

  

            {  

  

                Console.WriteLine("在SQL 中插入一条记录!");  

  

            }  

  

            public Department GetDepartment(int id)  

  

            {  

  

                Console.WriteLine("根据ID 号取出部门!");  

  

                return null;  

  

            }  

  

        }  

  

   

  

   

  

        //定义访问数据库表的工厂接口  

  

        interface IFactory  

  

        {  

  

            IUser CreateUser();  

  

            IDepartmnet CreatDepartment();  

  

        }  

  

   

  

        //实例化SQL 工厂接口  

  

        class SqlFactory : IFactory  

  

        {  

  

            public IUser CreateUser()  

  

            {  

  

                return new SqlserverUser();  

  

            }  

  

            public IDepartmnet CreatDepartment()  

  

            {  

  

                return new SQLdepartment();  

  

            }  

  

        }  

  

        //实例化Access工厂接口  

  

        class AccessFactory : IFactory  

  

        {  

  

            public IUser CreateUser()  

  

            {  

  

                return new AccessUser();  

  

            }  

  

            public IDepartmnet CreatDepartment()  

  

            {  

  

                return new Accessdepartment();  

  

            }  

  

        }  

  

          

  

        

  

        static void Main(string[] args)  

  

        {  

  

            User user = new User();  

  

            Department department = new Department();  

  

   

  

            IFactory factory = new SqlFactory();       

  

            IUser iu = factory.CreateUser();  

  

            iu.Insert(user);  

  

            iu.GetUser(2);//任意的int类型的都可以  

  

   

  

            IFactory factory1 = new  AccessFactory();  

  

            IUser au = factory1.CreateUser();  

  

            au.Insert(user);  

  

            au.GetUser(2);//任意的int类型的都可以  

  

   

  

            IFactory factoryd = new SqlFactory();  

  

            IDepartmnet id=factoryd .CreatDepartment ();  

  

            id.Insert (department );  

  

            id.GetDepartment (1);  

  

   

  

            IFactory factorya = new AccessFactory();  

  

            IDepartmnet ad=factoryd .CreatDepartment ();  

  

            ad.Insert (department );  

  

            ad.GetDepartment (1);  

          www.2cto.com

   

  

            //IUser au = new AccessUser();  

  

   

  

            //au.Insert(user);  

  

            //au.GetUser(2);//任意的int类型的都可以  

  

            Console.Read();  

  

        }  

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
威尔R.E.P.O.有交叉游戏吗?
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

荣耀Magic V3首发AI离焦护眼技术:有效缓解近视发展 荣耀Magic V3首发AI离焦护眼技术:有效缓解近视发展 Jul 18, 2024 am 09:27 AM

7月12日消息,荣耀MagicV3系列今日正式发布,搭载全新荣耀视力舒缓绿洲护眼屏,在屏幕本身具备高规格和高素质的同时,还开创性的引入AI主动式护眼技术。据悉,传统的缓解近视的方式是“近视镜”,近视眼镜度数均匀分布,保证了视线中心区域成像在视网膜之上,但周边区域成像在视网膜后,视网膜感应到成像在后,促进眼轴向后生长,从而使度数加深。目前主要的缓解近视发展的方式之一是“离焦镜”,其中心区域度数正常,周边区域通过光学设计分区调整,从而使周边区域成像落在视网膜前,

1399元起 荣耀X60i手机开售:视觉四等边OLED直屏 1399元起 荣耀X60i手机开售:视觉四等边OLED直屏 Jul 29, 2024 pm 08:25 PM

7月29日消息,荣耀X60i手机今日正式开售,首发1399元。设计上,荣耀X60i手机采用居中挖孔直屏设计,四边近乎无界的超窄边框,极大地拓宽了视野边界。荣耀X60i参数显示屏:6.7英寸高清显示屏电池:5000mAh大容量电池处理器:天玑6080处理器(台积电6nm,2x2.4G的A76+6×2G的A55)系统:MagicOS8.0系统其他功能:5G信号增强灵动胶囊屏下指纹双MIC降噪知识问答摄影能力:后置双摄系统:5000万像素主摄200万像素辅助镜头前置自拍镜头:800万像素价格:8GB

vivo信号最强手机!vivo X100s搭载寰宇信号放大系统:21天线、360°环绕设计 vivo信号最强手机!vivo X100s搭载寰宇信号放大系统:21天线、360°环绕设计 Jun 03, 2024 pm 08:41 PM

5月13日消息,vivoX100s今晚正式发布,除了出色的影像,新机在信号方面表现也十分强悍。据vivo官方介绍,vivoX100s采用了创新的寰宇信号放大系统,该系统配备了高达21根天线。这一设计基于直屏进行了重新优化,以平衡5G、4G、Wi-Fi、GPS以及NFC等众多信号需求。这使得vivoX100s成为了vivo有史以来信号接收能力最强的手机。新款手机还采用了独特的360°环绕设计,天线分布在机身周围。这一设计不仅增强了信号的强度,还针对日常各种握持姿势进行了优化,避免了因握持方式不当导

全新堆叠工艺!小米MIX Fold 4首搭金沙江'立体异形”电池 全新堆叠工艺!小米MIX Fold 4首搭金沙江'立体异形”电池 Jul 20, 2024 am 03:20 AM

7月19日消息,小米MIXFold4首旗舰折叠新机今晚正式发布,首次搭载“立体异形电池”。据介绍,小米MIXFold4在电池技术上实现了重大突破,专为折叠屏设计了创新的“立体异形电池”。传统折叠屏设备多采用常规方形电池,空间利用效率较低。为解决这一问题,小米没有采用常见的卷绕式电芯,而是全新开发叠片工艺,打造全新形态的电池,大幅提升了空间利用率。电池技术创新为了实现精确交替堆叠正负极片,确保锂离子安全嵌入,小米开发了新型超声焊接机和叠片机,提高了焊接和裁切精

小米百元机 Redmi 14C 设计规格曝光 将于 8 月 31 日发布 小米百元机 Redmi 14C 设计规格曝光 将于 8 月 31 日发布 Aug 23, 2024 pm 09:31 PM

小米的Redmi品牌正准备在其产品组合中增加另一款经济型手机——Redmi14C。该设备已确认将于8月31日在越南发布。然而,在发布之前,这款手机的规格已经通过越南零售商被披露。Redmi14CRedmi经常在新系列中带来全新的设计,Redmi14C也不例外。这款手机背面有一个大的圆形摄像头模块,与前代的设计完全不同。蓝色配色版甚至采用渐变设计,让它看起来感觉更加高端。不过,实际上Redmi14C是一款经济型手机。相机模组包括四个环;一个环内装有5000万像素主传感器,另一个可能装有用于深度信息

Java框架中设计模式与架构模式的区别 Java框架中设计模式与架构模式的区别 Jun 02, 2024 pm 12:59 PM

在Java框架中,设计模式和架构模式的区别在于:设计模式定义了在软件设计中解决常见问题的抽象解决方案,关注类和对象之间的交互,如工厂模式。架构模式定义了系统结构和模块之间的关系,关注系统组件的组织和交互,如分层架构。

荣耀Magic V3成功挑战滚筒洗衣机15分钟快洗:折叠唯一通过2.5米防水认证 荣耀Magic V3成功挑战滚筒洗衣机15分钟快洗:折叠唯一通过2.5米防水认证 Jul 18, 2024 pm 01:58 PM

7月12日消息,荣耀MagicV3今日正式发布,将折叠屏手机厚度带入9.2毫米。尤为值得一提的是,荣耀MagicV3在追求极致轻薄的同时,更通过前沿科技的运用,实现了行业领先的防水性能。得益于其采用的10微米级精密填充技术,这款手机不仅达到了IPX8级别的防水标准,即便在湿润环境下也能保持触控灵敏,为用户带来无忧的使用体验。发布会现场,荣耀更是以一场大胆的实验,直接将MagicV3置于滚筒洗衣机中进行15分钟快洗测试,结果令人惊叹——手机不仅安然无恙,更彰显了其卓越的防水实力。荣耀

折叠屏首上骁龙8s Gen3!联想moto razr 2024官宣:6月25日发布 折叠屏首上骁龙8s Gen3!联想moto razr 2024官宣:6月25日发布 Jun 14, 2024 am 09:42 AM

6月13日消息,摩托罗拉今日官宣,联想motorazr2024定档6月25日14:00发布,预计是此前入网的motorazr50/Ultra系列折叠屏手机。在规格方面,motorazr50的表现令人瞩目。它采用了一块6.9英寸的2640x1080OLED内屏,刷新率高达165Hz,为用户带来流畅的视觉体验。同时,其还配备了一块3.63英寸的1066×1056OLED外屏,刷新率也达到了144Hz,使得用户在日常使用中能够更加便捷。内外屏均支持10.7亿色显示,色彩表现丰富细腻。在硬件配置上,m

See all articles