设计模式—抽象模式

引用:https://www.cnblogs.com/cxydczzl/p/9597223.html

引用:https://www.jianshu.com/p/7a56b7bafbb9

1.什么是抽象工厂

2抽象工厂的优势是什么

3抽象工厂的劣势是什么

4怎么用抽象工厂模式

抽象工厂定义:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,无须指定它们具体的类。

抽象工厂优势:易拓展产品簇(产品簇:一系列类似的产品,举个例子:毛衣毛裤,内衣内裤都是一套)

抽象工厂劣势:不易拓展产品簇产品(举个例子:之前接口毛衣毛裤,内衣内裤已经设计好,若要再增加新的产品则需要修改抽象工厂接口,毛衣毛裤毛鞋,内衣内裤拖鞋)

怎么用抽象工厂模式

抽象工厂模式实现:

构建两张数据库表的对应类,只声明,不做任何操作。

Name类:

设计模式—抽象模式

Type类:

设计模式—抽象模式

为两张表创建相应的实现类:

IUser接口,用于客户端访问,解除与具体数据库访问的耦合:

设计模式—抽象模式

IType接口,用于客户端访问,解除与具体数据库访问的耦合:

设计模式—抽象模式

MySQLUser类,用于访问MySQL的User表:

设计模式—抽象模式

OracleUser类,用于访问Oracle的User表:

设计模式—抽象模式

同理创建相应的MySQL和Oracle数据库的Type表。

MySQLType类,用于访问MySQL的Type表:

设计模式—抽象模式

OracleType类,用于访问Oracle的Type表:

设计模式—抽象模式

接下来再让我们构建一个IFactory接口,定义一个访问User表对象和Type对象的抽象的工厂接口。

设计模式—抽象模式

MySQLFactory类,实现IFactory接口,实例化MySQLUser和MySQLType。

设计模式—抽象模式

OracleFactory类,实现IFactory接口,实例化OracleUser和OralceType。

设计模式—抽象模式

客户端代码:

设计模式—抽象模式

只需确认实例化哪一个数据库访问对象给factory。

运行结果如下:

设计模式—抽象模式

只需要更改IFactory factory = new MySQLFactory() 为IFactory factory = new OracleFactory() ,就实现了数据库访问的切换了。

有一个User类和User操作类的时候,是只需要工厂方法模式,但是现在显然你数据中有很多的表,而MySQL和Oracle有时两大不同的分类,所以解决这种涉及到多个产品系列的问题,就需要抽象工厂模式了。

虽然抽象工厂方法模式的类比较多,但是,主要分为4类。
AbstractFactory:抽象工厂角色,如CourseFactory类,它声明了一组用于创建一种产品的方法,每一个方法对应一种产品,如创建视频和创建手记。
ConcreteFactory:具体工厂角色,如JavaCourseFactory和PythonCourseFactory类,它实现了在抽象工厂中定义的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
AbstractProduce:抽象产品角色,如Video和Article类,它为每种产品声明接口。
ConcreteProduce:具体产品角色,如JavaVideo、JavaArticle、PythonVideo和PythonArticle类,它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。

1、优点

(1)具体产品在应用层代码隔离,无须关心创建细节
(2)将一系列的产品族统一到一起创建

2、缺点

(1)规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口
(2)增加了系统的抽象性和理解难度