抽象工厂――设计模式

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 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Honor Magic V3 が AI デフォーカス眼保護技術をデビュー: 近視の進行を効果的に軽減 Honor Magic V3 が AI デフォーカス眼保護技術をデビュー: 近視の進行を効果的に軽減 Jul 18, 2024 am 09:27 AM

7月12日のニュースによると、Honor Magic V3シリーズは本日正式にリリースされ、新しいHonor Vision Soothing Oasisアイプロテクションスクリーンを搭載しており、スクリーン自体は高スペックで高品質であると同時に、AIアクティブアイプロテクションの導入も先駆けとなっています。テクノロジー。近視を軽減する伝統的な方法は「近視メガネ」であると報告されています。近視メガネの度数は均等に分散され、視野の中心領域は網膜上に結像されますが、周辺領域は網膜の後ろに結像されます。網膜は像が遅れていると認識し、眼軸方向の成長を促進し、その度数が深くなります。現在、近視の進行を軽減する主な方法の 1 つは、「デフォーカス レンズ」です。中央領域は通常の度数で、周辺領域は光学設計の隔壁によって調整され、周辺領域の像が収まります。網膜の前。

信号が最も強い 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 度サラウンド設計も採用しています。この設計は信号強度を高めるだけでなく、日常のさまざまな保持姿勢を最適化し、不適切な保持方法によって引き起こされる問題を回避します。

Honor X60i携帯電話は1,399元から販売中:視覚的な四角形OLEDダイレクトスクリーン Honor X60i携帯電話は1,399元から販売中:視覚的な四角形OLEDダイレクトスクリーン Jul 29, 2024 pm 08:25 PM

7月29日のニュースによると、Honor X60i携帯電話は本日正式に発売され、価格は1,399元からとなっている。デザインの面では、Honor X60i 携帯電話は、中央に穴があり、四辺すべてにほぼ境界のない超狭い境界線を備えたストレート スクリーン デザインを採用しており、視野が大幅に広がります。 Honor X60i パラメータ ディスプレイ: 6.7 インチ高解像度ディスプレイ バッテリー: 5000mAh 大容量バッテリー プロセッサー: Dimensity 6080 プロセッサー (TSMC 6nm、2x2.4G A76+6x2G A55) システム: MagicOS8.0 システム その他の機能: 5G 信号強化、スマートカプセル、画面下指紋認証、デュアルMIC、ノイズリダクション、知識Q&A、撮影機能:背面デュアルカメラシステム:5000万画素メインカメラ、200万画素補助レンズ、フロントセルフィーレンズ:800万画素、価格:8GB

新しいスタッキングプロセス! Xiaomi MIX Fold 4は初めて金沙江「三次元特殊形状」バッテリーを搭載 新しいスタッキングプロセス! Xiaomi MIX Fold 4は初めて金沙江「三次元特殊形状」バッテリーを搭載 Jul 20, 2024 am 03:20 AM

7月19日のニュースによると、初の主力折りたたみ新型携帯電話であるXiaomi MIX Fold 4が今夜正式にリリースされ、初めて「三次元特殊形状バッテリー」を搭載したとのこと。レポートによると、Xiaomi MIX Fold4はバッテリー技術で大きな進歩を遂げ、折りたたみ式スクリーン専用に革新的な「三次元特殊形状バッテリー」を設計しました。従来の屏風型端末は、スペース利用効率が低い従来の角形電池を使用することがほとんどでした。この問題を解決するために、Xiaomi は一般的な巻回バッテリーセルを使用せず、新しいラミネートプロセスを開発して新しい形式のバッテリーを作成し、スペース利用率を大幅に改善しました。バッテリー技術の革新 正極シートと負極シートを正確に交互に積み重ね、リチウムイオンの安全な埋め込みを確保するために、Xiaomi は新しい超音波溶接機とラミネート機を開発し、溶接と切断の精度を向上させました。

Xiaomiの100元携帯電話Redmi 14Cのデザイン仕様が明らかに、8月31日に発売される Xiaomiの100元携帯電話Redmi 14Cのデザイン仕様が明らかに、8月31日に発売される Aug 23, 2024 pm 09:31 PM

Xiaomi の Redmi ブランドは、ポートフォリオにもう 1 つの低価格携帯電話、Redmi 14C を追加する準備を進めています。このデバイスはベトナムで8月31日に発売されることが確認されています。しかし、発売に先立ち、ベトナムの小売店を通じて携帯電話の仕様が明らかになった。 Redmi14CR Redmiは新しいシリーズに新しいデザインをもたらすことが多く、Redmi14Cも例外ではありません。この携帯電話の背面には大きな円形のカメラモジュールがあり、前世代のデザインとはまったく異なります。ブルーカラーバージョンでは、グラデーションデザインを採用し、より高級感を演出しています。しかし、Redmi14Cは実際には経済的な携帯電話です。カメラ モジュールは 4 つのリングで構成され、1 つはメインの 50 メガピクセル センサーを収容し、もう 1 つは深度情報用のカメラを収容します。

Java フレームワークにおけるデザイン パターンとアーキテクチャ パターンの違い Java フレームワークにおけるデザイン パターンとアーキテクチャ パターンの違い Jun 02, 2024 pm 12:59 PM

Java フレームワークにおけるデザイン パターンとアーキテクチャ パターンの違いは、デザイン パターンがソフトウェア設計における一般的な問題に対する抽象的な解決策を定義し、ファクトリ パターンなどのクラスとオブジェクト間の相互作用に焦点を当てていることです。アーキテクチャ パターンは、階層化アーキテクチャなどのシステム コンポーネントの編成と相互作用に焦点を当てて、システム構造とモジュールの間の関係を定義します。

Honor Magic V3 はドラム式洗濯機の 15 分間の高速洗浄に成功しました。2.5 メートルの防水認証に合格した唯一の折りたたみデバイスです。 Honor Magic V3 はドラム式洗濯機の 15 分間の高速洗浄に成功しました。2.5 メートルの防水認証に合格した唯一の折りたたみデバイスです。 Jul 18, 2024 pm 01:58 PM

7 月 12 日のニュースによると、Honor Magic V3 が本日正式にリリースされ、折りたたみ式携帯電話の厚さが 9.2 mm になりました。特筆すべきは、Honor MagicV3は究極の薄さと軽さを追求しながらも、最先端技術により業界トップクラスの防水性能を実現していること。 10ミクロンの精密充填技術により、この携帯電話はIPX8防水規格に達するだけでなく、湿気の多い環境でもタッチ感度を維持し、ユーザーに安心な体験を提供します。 Honor は記者会見で大胆な実験を行い、MagicV3 をドラム式洗濯機に直接入れて 15 分間の迅速な洗濯テストを行いました。その結果は驚くべきものでした。携帯電話が安全であるだけでなく、その優れた防水機能も実証されました。栄光

折りたたみ式スクリーンにSnapdragon 8s Gen3を搭載! Lenovo moto razr 2024 正式発表: 6 月 25 日にリリース 折りたたみ式スクリーンにSnapdragon 8s Gen3を搭載! Lenovo moto razr 2024 正式発表: 6 月 25 日にリリース Jun 14, 2024 am 09:42 AM

6月13日のニュースによると、Motorolaは本日、Lenovo Motorazr 2024が6月25日14:00にリリースされる予定であると正式に発表しました。これは、以前にインターネットに登場した折りたたみスクリーン携帯電話のMotorazr50/Ultraシリーズとなる予定です。仕様の点では、MotorazR50 のパフォーマンスは印象的です。最大 165Hz のリフレッシュ レートを備えた 6.9 インチ 2640x1080 OLED 内部スクリーンを使用し、ユーザーにスムーズな視覚体験を提供します。同時に、リフレッシュレート144Hzの3.63インチ1066×1056 OLED外部スクリーンも装備されており、ユーザーの日常使用がより便利になります。内部画面と外部画面の両方が 10 億 7,000 万色のディスプレイをサポートし、豊かで繊細な色彩性能を実現します。ハードウェア構成に関しては、m

See all articles