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).客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时。