工厂方法模式
概述
工厂方法模式:定义一个用于创建对象的接口,但是让字类决定将那个类实例化,工厂方法模式让一个类的实例化延迟到其子类
工厂方法模式结构
Product(抽象产品):它是定义产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的公共父类
ConcreteProduct(具体产品):它实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂和具体产品之间一一对应
Factory(抽象工厂):在抽象工厂类中声明了工厂方法,用于返回一个产品.抽象工厂是工厂方法模式的核心,所有创建对象的工厂类都必须实现该接口
ConcreteFactory(具体工厂):他是抽象工厂类的子类,实现了在抽象工厂中声明的工厂发发,并可由客户端调用,返回一个具体产品类的实例
public interface LoggerFactory {
public Logger createLogger();
}
public interface Logger {
public void writeLog();
}
public class DatabaseLoggerFactory implements LoggerFactory {
@Override
public Logger createLogger() {
// TODO Auto-generated method stub
Logger logger = new DatabaseLogger();
return logger;
}
}
public class DatabaseLogger implements Logger {
@Override
public void writeLog() {
// TODO Auto-generated method stub
System.out.println("数据库日志记录");
}
}
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
LoggerFactory factory;
Logger logger ;
factory = new DatabaseLoggerFactory();
// factory = new FileLoggerFactory();
logger = factory.createLogger();
logger.writeLog();
}
}
优缺点
优点:提供了专门的工厂方法来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节;它能够让工厂自主确定创建何种产品对象,而如何创建这个对象的细节完全封装在具体工厂内部;在系统中加入新产品时完全符合开闭原则,
缺点:系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,会给系统带来一些额外的开销,增加了系统的抽象性和理解难度