工厂模式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
主要解决:主要解决接口选择的问题。
何时使用:我们明确地计划不同条件下创建不同实例时。
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
关键代码:创建过程在其子类执行。
应用实例: 您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现
Ⅰ简单工厂模式(Simple Factory)的实现
1.创建抽象类
public abstract class Computer{
/**
* 产品的抽象方法,由具体的产品类去实现
*/
public abstract void start();
}
2. 创建具体产品类
public class LenovoComputer extends Computer{
@Override
public void start() {
System.out.println("联想电脑启动");
}
}
public class HuaweiComputer extends Computer{
@Override
public void start() {
System.out.println("华为电脑启动");
}
}
3.创建工厂类
public class ComputerFactory {
public static Computer createComputer(String type){
Computer mComputer=null;
switch(type){
case"lenovo":
mComputer = new LenovoComputer();
break;
case"huawei":
mComputer = new HuaweiComputer();
break;
}
return mComputer;
}
}
4.调用
public static void main(String[] args) {
ComputerFactory.createComputer("huawei").start();
}
优点
1.工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。
2.当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
缺点
系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂,违背了"开放--封闭"原则(OCP).另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。
Ⅱ.工厂方法模式(Factory Method)的实现
和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂。也就是定义一个抽象工厂,其定义了产品的生产接口,但不负责具体的产品,将生产任务交给不同的派生类工厂。这样不用通过指定类型来创建对象了。
实现:
某系统运行日志记录器( Logger)可以通过多种途径保存系统的运行日志,例如通过文件记录或数据库记录,用户可以通过修改配置文件灵活地更换日志记录方式。在设计各类日志记录器时,开发人员发现需要对日志记录器进行一些初始化工作,初始化参数的设置过程较为复杂,而且某些参数的设置有严格的先后次序,否则可能会发生记录失败。 为了更好地封装记录器的初始化过程并保证多种记录器切换的灵活性,现使用工厂方法模式设计该系统
1.创建Logger对象接口
public interface Logger {
public void writeLog();
}
2.创建不同的Logger对象
public DatabaseLogger implements Logger{
@Override
public void writeLog(){
System.out.println("数据库日志记录");
}
}
public FileLogger implements Logger{
@Override
public void writeLog(){
System.out.println("数据库日志记录");
}
}
3.创建工厂接口
public interface LoggerFactory {
public Logger createLogger(); // 抽象工厂方法
}
4.创建工厂对象
public class DatabaseLoggerFactory implements LoggerFactory {
public Logger createLogger(){
//连接数据库,代码省略
Logger logger= new DatabaseLogger();
//初始化数据库日志记录器,代码省略
return logger;
}
}
public class FileLoggerFactory implements LoggerFactory{
public Logger createlogger() {
Logger logger= new FileLogger();
//创建文件,代码省略
return logger;
}
}
5.调用
public class Client {
public static vold main(string []args){
LoggerFactory factory;
Logger logger;
factory = new FileloggerFactory();
logger = factory.createlogger();
logger.writeLog();
}
}
Ⅲ.抽象工厂(Abstract Factory)模式介绍:
1、什么是抽象工厂模式:
抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建多个产品族中的产品
2、抽象工厂模式的使用情况:
系统的产品多于一个产品族,系统只消费一个产品族的产品的时候,一般使用抽象工厂模式。
3、抽象工厂模式和工厂方法模式的不同:
(1)工厂方法模式针对一个产品等级结构;抽象工厂模式针对多个产品等级结构。
(2)工厂方法模式中一个具体的工厂只创建一种产品,抽象工厂模式中一个工厂可以创建多个同一类型的产品,相当于工厂模式的组合。