【设计模式】【2】工厂方法

工厂方法(Factory Method)

工厂方法是一种创建型设计模式, 其在父类中提供一个创建对象的  方法,允许子类决定实例化对象  的类型。

案例说明

基础对话框类使用不同的 UI 组件渲染窗口。在不同的操作系统下,这些组件外观或许略有不同,但其功能保持一致。
Windows 系统中的按钮在 Linux 系统中仍然是按钮。如果使用工厂方法,就不需要为每种操作系统重写对话框逻
辑。如果我们声明了一个在基本对话框类中生成按钮的工厂方法,那么我们就可以创建一个对话框子类,
并使其通过工厂方法返回 Windows 样式按钮。子类将继承对话框基础类的大部分代码,
同时在屏幕上根据 Windows 样式渲染按钮。如需该模式正常工作,基础对话框类必须使用抽象按钮(例
如基类或接口),以便将其扩展为具体按钮。这样一来,无论对话框中使用何种类型的按钮,其代码都可以正常工作。
你可以使用此方法开发其他 UI 组件。

UML图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XSWpp8mJ-1638871911254)(/home/nantian/.config/Typora/typora-user-images/image-20211207181109844.png)]

核心代码

1、factory/Dialog
/**
 * @author: ccyy
 * @create: 2021-10-11
 * @description: 创建者类声明工厂方法必须返回一个产品类的对象,创建者的子类通常会提供 该方法的实现。
 **/
public abstract class  Dialog {
    abstract Button createButton();

    public void render(){
        Button button = createButton();
//        使用button
        button.render();
    }
}
2、factory/WebDialog
/**
 * @author: ccyy
 * @create: 2021-10-11
 * @description:
 **/
public class WebDialog extends Dialog{
    @Override
    Button createButton() {
        return new HTMLButton();
    }
}
3、factory/WindowsDIalog
/**
 * @author: ccyy
 * @create: 2021-10-11
 * @description: 具体创建者将重写工厂方法以改变其所返回的产品类型。
 **/
public class WindowsDialog extends Dialog {
    @Override
    Button createButton() {
        return new WindowsButton();
    }
}
4、project/Button
/**
 * @author: ccyy
 * @create: 2021-10-11
 * @description: 产品接口中将声明所有具体产品都必须实现的操作。
 **/
public interface Button {
    void render();

    void onClick();
}
5、project/WebButton
/**
 * @author: ccyy
 * @create: 2021-10-11
 * @description: html按钮
 **/
public class HTMLButton implements Button{
    @Override
    public void render() {
        System.out.println("创建一个html按钮");
        onClick();
    }

    @Override
    public void onClick() {
        System.out.println("点击了html按钮");
    }
}
6、project/WindowsButton
/**
 * @author: ccyy
 * @create: 2021-10-11
 * @description: windows按钮
 **/
public class WindowsButton implements Button{
    @Override
    public void render() {
        System.out.println("创建了一个windows按钮");
        onClick();
    }

    @Override
    public void onClick() {
        System.out.println("点击了一个windows按钮");
    }
}
7、测试方法
/**
 * @author: ccyy
 * @create: 2021-10-11
 * @description: 测试
 **/
public class Main {
    public static void main(String[] args) {
//        使用工厂方法创建windows按钮
        Dialog winDialog = new WindowsDialog();
        winDialog.render();
//        使用工厂方法创建web按钮
        Dialog webDialog = new WebDialog();
        webDialog.render();
    }
}

总结

优点:

  • 你可以避免创建者和具体产品之间的紧密耦合。
  • 单一职责原则。你可以将产品创建代码放在程序的单一位置,从而使得代码更容易维护。
  • 开闭原则。无需更改现有客户端代码,你就可以在程序中引入新的产品类型。

缺点:应用工厂方法模式需要引入许多新的子类,代码可能会因此变得更复杂。最好的情况是将该模式引入创建者类的现有层次结构中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值