持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情
本文系作者 不太自律的程序猿原创,转载请私信并在文章开头附带作者和原文地址链接。
抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。
工厂模式中的每一个形态都是针对一定问题的解决方案,工厂方法针对的是多个产品系列结构;而抽象工厂模式针对的是多个产品族结构,一个产品族内有多个产品系列。
使用场景
程序需要处理不同系列的相关产品,但是您不希望它依赖于这些产品的具体类时,可以使用抽象工厂
代码演示
public class AbstractFactoryTest {
public static void main(String[] args) {
IDatabaseUtils iDatabaseUtils=new OracleDataBaseUtils(); //
IConnection connection=iDatabaseUtils.getConnection();
connection.connect();
ICommand command=iDatabaseUtils.getCommand();
command.command();
}
}
// 变化: mysql , oracle. ...
// connection , command ,
interface IConnection{
void connect();
}
interface ICommand{
void command();
}
interface IDatabaseUtils{
IConnection getConnection();
ICommand getCommand();
}
class MysqlConnection implements IConnection{
@Override
public void connect() {
System.out.println("mysql connected.");
}
}
class OracleConnection implements IConnection{
@Override
public void connect() {
System.out.println("oracle connected.");
}
}
class MysqlCommand implements ICommand{
@Override
public void command() {
System.out.println(" mysql command. ");
}
}
class OracleCommand implements ICommand{
@Override
public void command() {
System.out.println("oracle command.");
}
}
class MysqlDataBaseUtils implements IDatabaseUtils{
@Override
public IConnection getConnection() {
return new MysqlConnection();
}
@Override
public ICommand getCommand() {
return new MysqlCommand();
}
}
class OracleDataBaseUtils implements IDatabaseUtils{
@Override
public IConnection getConnection() {
return new OracleConnection();
}
@Override
public ICommand getCommand() {
return new OracleCommand();
}
}
优缺点
优点:
抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建; 抽象工厂模式可以实现高内聚低耦合的设计目的; 符合“开闭原则”,增加具体产品或具体工厂都很方便,无须修改系统其它工厂逻辑;
缺点:
添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。 开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦,具体可看条目一的海尔和长虹产品等级结构图)
JDK源码中的应用:
1 java.sql.Connection
2 java.sql.Driver
感谢诸君的观看,文中如有纰漏,欢迎在评论区来交流。如果这篇文章帮助到了你,欢迎点赞👍关注。