搜索
首页数据库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
如何在PHP后端功能开发中合理应用设计模式?如何在PHP后端功能开发中合理应用设计模式?Aug 07, 2023 am 10:34 AM

如何在PHP后端功能开发中合理应用设计模式?设计模式是一种经过实践证明的解决特定问题的方案模板,可以用于构建可复用的代码,在开发过程中提高可维护性和可扩展性。在PHP后端功能开发中,合理应用设计模式可以帮助我们更好地组织和管理代码,提高代码质量和开发效率。本文将介绍常用的设计模式,并给出相应的PHP代码示例。单例模式(Singleton)单例模式适用于需要保

如何通过编写代码来学习和运用 PHP8 的设计模式如何通过编写代码来学习和运用 PHP8 的设计模式Sep 12, 2023 pm 02:42 PM

如何通过编写代码来学习和运用PHP8的设计模式设计模式是软件开发中常用的解决问题的方法论,它可以提高代码的可扩展性、可维护性和重用性。而PHP8作为最新版的PHP语言,也引入了许多新特性和改进,提供更多的工具和功能来支持设计模式的实现。本文将介绍一些常见的设计模式,并通过编写代码来演示在PHP8中如何运用这些设计模式。让我们开始吧!一、单例模式(Sing

深入聊聊设计模式利器之“职责链模式”(附go实现流程)深入聊聊设计模式利器之“职责链模式”(附go实现流程)Jan 17, 2023 am 11:43 AM

本篇文章给大家带来了关于golang设计模式的相关知识,其中主要介绍了职责链模式是什么及其作用价值,还有职责链Go代码的具体实现方法,下面一起来看一下,希望对需要的朋友有所帮助。

Go语言中的ETL的设计模式Go语言中的ETL的设计模式Jun 01, 2023 pm 09:01 PM

随着数据的增长和复杂性的不断提升,ETL(Extract、Transform、Load)已成为数据处理中的重要环节。而Go语言作为一门高效、轻量的编程语言,越来越受到人们的热捧。本文将介绍Go语言中常用的ETL设计模式,以帮助读者更好地进行数据处理。一、Extractor设计模式Extractor是指从源数据中提取数据的组件,常见的有文件读取、数据库读取、A

“PHP面向对象编程入门:从概念到实践”“PHP面向对象编程入门:从概念到实践”Feb 25, 2024 pm 09:04 PM

什么是面向对象编程?面向对象编程(OOP)是一种编程范式,它将现实世界中的实体抽象为类,并使用对象来表示这些实体。类定义了对象的属性和行为,而对象则实例化了类。OOP的主要优点在于它可以使代码更易于理解、维护和重用。OOP的基本概念OOP的主要概念包括类、对象、属性和方法。类是对象的蓝图,它定义了对象的属性和行为。对象是类的实例,它具有类的所有属性和行为。属性是对象的特征,它可以存储数据。方法是对象的函数,它可以对对象的数据进行操作。OOP的优点OOP的主要优点包括:可重用性:OOP可以使代码更

深入解析Go语言中的单例模式深入解析Go语言中的单例模式Mar 21, 2023 pm 06:36 PM

单例模式是一种常见的设计模式,它在系统中仅允许创建一个实例来控制对某些资源的访问。在 Go 语言中,实现单例模式有多种方式,本篇文章将带你深入掌握 Go 语言中的单例模式实现。

格式化工厂使用教程格式化工厂使用教程Feb 26, 2024 pm 10:00 PM

格式化工厂使用教程随着科技的发展,电脑已经成为我们日常生活中不可或缺的工具。在使用电脑的过程中,我们经常会遇到各种问题,其中最常见的就是电脑运行缓慢或出现错误。而其中一个常见的解决办法就是使用格式化工厂。什么是格式化工厂?格式化工厂是一款功能强大的系统维护工具,它可以帮助我们修复电脑中的各种问题,例如慢速运行、崩溃和错误等。使用格式化工厂可以清理电脑中的垃圾

设计模式的六大原则是什么设计模式的六大原则是什么Jan 06, 2023 pm 04:25 PM

设计模式的六大原则:1、单一职责原则,其核心就是控制类的粒度大小、将对象解耦、提高其内聚性;2、开闭原则,可以通过“抽象约束、封装变化”来实现;3、里氏替换原则,主要阐述了有关继承的一些原则;4、依赖倒置原则,降低了客户与实现模块之间的耦合;5、接口隔离原则,是为了约束接口、降低类对接口的依赖性;6、迪米特法则,要求限制软件实体之间通信的宽度和深度。

See all articles

热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.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。