设计模式—抽象模式
引用: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)增加了系统的抽象性和理解难度