【创建模式-工厂方法模式(Factory Method Pattern)】

江城子·乙卯正月二十日夜记梦


十年生死两茫茫,不思量,自难忘。千里孤坟,无处话凄凉。纵使相逢应不识,尘满面,鬓如霜。
夜来幽梦忽还乡,小轩窗,正梳妆。相顾无言,惟有泪千行。料得年年肠断处,明月夜,短松冈。

概述

  定义一个创建对象的接口,该接口的子类具体负责创建具体的对象。工厂方法模式将对象的实例化延迟到子类,即:对象的实例化过程被推迟到子类中完成,而不是在父类中直接完成。工厂方法模式的核心思想是: ①适用于产品类型多样且需要动态选择的场景;②它将产品的创建逻辑封装在工厂方法中,客户端只需通过工厂获取产品,无需关心具体实现。

优点

  • 简单工厂是直接在创建方法中负责所有的产品的生成,造成该方法臃肿,并且当新增产品类时会修改该方法,违背了开闭原则 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();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值