首頁 資料庫 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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 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)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
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°環繞設計,天線分佈在機身周圍。這項設計不僅增強了訊號的強度,還針對日常各種握持姿勢進行了優化,避免了因握持方式不當導

榮耀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手機今日正式開售,先發1,399元。設計上,榮耀X60i手機採用居中挖孔直屏設計,四邊近乎無界的超窄邊框,大大拓寬了視野邊界。榮耀X60i參數顯示器:6.7吋高清顯示器電池:5000mAh大容量電池處理器:天璣6080處理器(台積電6nm,2x2.4G的A76+6×2G的A55)系統:MagicOS8.0系統其他功能: 5G訊號增強靈動膠囊螢幕下指紋雙MIC降噪知識問答攝影能力:後置雙攝系統:5000萬像素主攝200萬像素輔助鏡頭前置自拍鏡頭:800萬像素價格:8GB

全新堆疊工藝!小米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萬像素主傳感器,另一個可能裝有用於深度信息

榮耀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分鐘快洗測試,結果令人驚嘆——手機不僅安然無恙,更彰顯了其卓越的防水實力。榮耀

Java框架中設計模式與架構模式的區別 Java框架中設計模式與架構模式的區別 Jun 02, 2024 pm 12:59 PM

在Java框架中,設計模式和架構模式的區別在於:設計模式定義了在軟體設計中解決常見問題的抽象解決方案,專注於類別和物件之間的交互,例如工廠模式。架構模式定義了系統結構和模組之間的關係,關注系統元件的組織和交互,如分層架構。

折疊螢幕首上驍龍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