当前位置: 首页 > news >正文

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

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

  • 目的
  • 动机
  • 简单工厂
  • 示例代码

目的

定义一个创建对象的接口,该接口的子类具体负责创建具体的对象。工厂方法模式将对象的实例化延迟到子类。简单工厂是直接在创建方法中负责所有的产品的生成,造成该方法臃肿,并且当新增产品类时会修改该方法,违背了开闭原则 Open Close Principle 。

动机

创建模式其实都是对new关键字的封装和抽象,工厂方法也不例外,所以工厂方法首先解决的就是创建问题,即在一个类的创建过程比较复杂的情况下比如:一个对象的创建需要通过读取配置文件根据配置文件的参数来生成,或者类的创建过程又要依赖于其他类以及可能更复杂的情况。将对象复杂的创建过程封装到工厂的一个创建方法里,就可以方便其他调用者的使用。

简单工厂

简单工厂就是直接将对象的创建过程全部封装在一个方法里,需要生成不同的对象通过在生成的方法中传入不同的参数来对应不同的产品对象。这样简单工厂存在的问题就是,如果要新增产品类型,那么就需要修改简单工厂生成对象的逻辑,这里就违反了设计模式里面的开闭原则 Open Close Principle(对扩展开放,对修改关闭)。所以简单工厂适用于创建的类比较少的场景。

在这里插入图片描述

示例代码

  • 产品接口
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();
    }
}

相关文章:

  • UE5以插件的形式加载第三方库
  • AI+视频监控电力巡检:EasyCVR视频中台方案如何赋能电力行业智能化转型
  • 爬虫的精准识别:基于 User-Agent 的正则实现
  • 【RTSP】客户端(一):RTSP协议实现
  • 【机械视觉】C#+VisionPro联合编程———【五、硬币检测小项目实现(C#+VisionPro联合编程和csv文件格式操作)】
  • [Web]ServletContext域(Application)
  • 【Agent】Windows 和 CentOS 安装 Conda
  • wireguard搭配udp2raw部署内网
  • 坐落于杭州的电商代运营公司品融电商
  • 智能验证码破解:突破reCAPTCHA、Cloudflare和hCaptcha的全方位解决方案
  • selenium的鼠标操作
  • 每天一道算法题【蓝桥杯】【x的平方根】
  • 通义万相2.1 图生视频:为AI绘梦插上翅膀,开启ALGC算力领域新纪元
  • Qt5.10版本以下 qml ui语言动态切换
  • MySQL EXPLAIN 详解
  • 网络安全linux命令
  • CAAC无人机考证备考清单
  • 《用 python、MySQL 和 Chart.js 打造炫酷数据看板》实战案例笔记
  • SQLiteStudio:一款免费开源跨平台的SQLite管理工具
  • Kerckhoffs原理
  • 国际金价下跌,中概股多数上涨,穆迪下调美国主权信用评级
  • 纪念|脖子上挂着红领巾的陈逸飞
  • 雅典卫城上空现“巨鞋”形状无人机群,希腊下令彻查
  • 官方通报汕头违建豪宅“英之园”将强拆:对有关人员严肃追责问责
  • 打击网络侵权盗版!四部门联合启动“剑网2025”专项行动
  • 新华时评:让医德医风建设为健康中国护航