十年生死两茫茫,不思量,自难忘。千里孤坟,无处话凄凉。纵使相逢应不识,尘满面,鬓如霜。
夜来幽梦忽还乡,小轩窗,正梳妆。相顾无言,惟有泪千行。料得年年肠断处,明月夜,短松冈。
概述
定义一个创建对象的接口,该接口的子类具体负责创建具体的对象。工厂方法模式将对象的实例化延迟到子类,即:对象的实例化过程被推迟到子类中完成,而不是在父类中直接完成。工厂方法模式的核心思想是: ①适用于产品类型多样且需要动态选择的场景;②它将产品的创建逻辑封装在工厂方法中,客户端只需通过工厂获取产品,无需关心具体实现。
优点
- 简单工厂是直接在创建方法中负责所有的产品的生成,造成该方法臃肿,并且当新增产品类时会修改该方法,违背了开闭原则 Open Close Principle 。
- 客户端代码只需依赖抽象产品接口,无需关心具体产品的实现细节。
缺点
- 每新增加一个产品类,就会新增一个对应的工厂类。
应用场景
- 支付系统
产品类型:支付宝、微信支付、银行卡支付。
根据用户选择的支付方式,动态创建对应的支付对象。
- 日志系统:
产品类型:文件日志、数据库日志、控制台日志。
根据配置决定使用哪种日志记录方式。
- UI 主题:
产品类型:暗黑主题、明亮主题。
根据用户设置动态切换主题
示例代码
- 产品接口
package org.cqcs.knowledge.designpattern.creation.factorymethod.product;
/**
* 抽象产品:按钮接口
* }
*/
public interface IButton {
void render();
void onClick();
}
- 产品实现
package org.cqcs.knowledge.designpattern.creation.factorymethod.product.impl;
import org.cqcs.knowledge.designpattern.creation.factorymethod.product.IButton;
/**
* 具体产品:Windows按钮
*/
public class WindowsButton implements IButton {
@Override
public void render() {
System.out.println("Windows风格按钮渲染完成");
}
@Override
public void onClick() {
System.out.println("Windows按钮点击事件");
}
}
package org.cqcs.knowledge.designpattern.creation.factorymethod.product.impl;
import org.cqcs.knowledge.designpattern.creation.factorymethod.product.IButton;
/**
* 具体产品:Mac按钮
*/
public class MacButton implements IButton {
@Override
public void render() {
System.out.println("Mac风格按钮渲染完成");
}
@Override
public void onClick() {
System.out.println("Mac按钮点击事件");
}
}
- 工厂接口
package org.cqcs.knowledge.designpattern.creation.factorymethod.factory;
import org.cqcs.knowledge.designpattern.creation.factorymethod.product.IButton;
/**
* 抽象创建者:按钮工厂接口
*/
public interface IButtonFactory {
IButton createButton(); // 工厂方法
}
- 工厂实现
package org.cqcs.knowledge.designpattern.creation.factorymethod.factory.impl;
import org.cqcs.knowledge.designpattern.creation.factorymethod.factory.IButtonFactory;
import org.cqcs.knowledge.designpattern.creation.factorymethod.product.IButton;
import org.cqcs.knowledge.designpattern.creation.factorymethod.product.impl.WindowsButton;
/**
* 具体创建者:Windows按钮工厂
*/
public class WindowsButtonFactory implements IButtonFactory {
@Override
public IButton createButton() {
return new WindowsButton();
}
}
package org.cqcs.knowledge.designpattern.creation.factorymethod.factory.impl;
import org.cqcs.knowledge.designpattern.creation.factorymethod.factory.IButtonFactory;
import org.cqcs.knowledge.designpattern.creation.factorymethod.product.IButton;
import org.cqcs.knowledge.designpattern.creation.factorymethod.product.impl.MacButton;
/**
* 具体创建者:Mac按钮工厂
*/
public class MacButtonFactory implements IButtonFactory {
@Override
public IButton createButton() {
return new MacButton();
}
}