【设计模式】----工厂方法模式简介

1.概念

1.工厂方法模式,在静态工厂方法的基础上,进行“升级”,,工厂方法模式最重要的区别是引入了抽象工厂角色,抽象工厂可以是 接口,也可以是抽象类或者具体类。
2.在抽象工厂中声明了工厂方法但并未实现工厂方法,具体产品对象的创建由其子类负责,客 户端针对抽象工厂编程,可在运行时再指定具体工厂类,具体工厂类实现了工厂方法,不同 的具体工厂可以创建不同的具体产品。
3.在实际使用时,具体工厂类在实现工厂方法时除了创建具体产品对象之外,还可以负责产品 对象的初始化工作以及一些资源和环境配置工作,例如连接数据库、创建文件等。 在客户端代码中,只需关心工厂类即可,不同的具体工厂可以创建不同的产品。
4.总的来说就是将工厂类像对产品的封装一样,对外展示一个接口,然后实现具体产品的时候,继承这个接口,实现方法等。工厂类也一样,定义一个抽象工厂类,然后在具体实现的过程中,具体工厂继承抽象工厂类的方法等。
对外也只是调用抽象类的接口。

2.UML图

在这里插入图片描述

3.代码展示

package p1;
//客户端
public class Client  { 
public static void main(String args[]) {
        LogFactory factory;
        Log logger1;
        factory = new FileLogFactory();
        logger1 = factory.CreateLog();
        logger1.WriteLog();
        Log logger2;
        factory = new SqlSeverDatabaseLogFactory();
        logger2 = factory.CreateLog();
        logger2.WriteLog();
        Log logger3;
        factory = new OracleDatabaseLogFactory();
        logger3 = factory.CreateLog();
        logger3.WriteLog();
    }
}
 //抽象工厂角色--对外接口
interface  LogFactory{                             
    public Log CreateLog();
}
//具体工厂角色--文件
class FileLogFactory implements LogFactory { 
    public Log CreateLog(){
        Log log=new FileLog();
        return log;
    }
}
//具体工厂角色--Sql数据库
class SqlSeverDatabaseLogFactory implements LogFactory{ 
    public Log CreateLog(){
        Log log=new SqlSeverDatabaseLog();
        return log;
    }
}
//具体工厂角色--Oracle数据库
class OracleDatabaseLogFactory implements LogFactory{   
    public Log CreateLog(){
        Log log=new OracleDatabaseLog();
        return log;
    }
}
//抽象产品角色--对外接口
interface Log{  				 
    public void WriteLog();
}
//文件记录:具体产品角色
class FileLog implements Log{  
    public void WriteLog(){
        System.out.println("文件日志记录成功。");
    }
}
//Sql数据库记录:具体产品角色
class SqlSeverDatabaseLog implements Log{    public void WriteLog(){
        System.out.println("Sql数据库记录成功");
    }
}
//Oracle数据库记录:具体产品角色
class OracleDatabaseLog implements Log{ 
    public void WriteLog(){
        System.out.println("Oracle数据库记录成功");
    }
}

4.结果展示

在这里插入图片描述

5. 分析总结

1.优点
(1).工厂方法定义了抽象工厂类,具体工厂只负责创建对应的产品,符合单一职责原则。
(2).加入新产品时,只需要继承抽象工厂类,而不需要修改原有的代码,符合开闭原则。
2.缺点
(1).添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类,系统类的个数将成对增加,在一定程度上增加了系统的复杂度;同时,有更多的类需要编译和运行,会给系统带来一些额外的开销;
(2).增加了系统的抽象性和理解难度。
3.适用场景

(1).一个类不知道它所需要的对象的类。
(2).一个类通过其子类来指定创建哪个对象。
(3).客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时。

发布了84 篇原创文章 · 获赞 6 · 访问量 4725

猜你喜欢

转载自blog.csdn.net/qq_41152046/article/details/105478504