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

设计模式4-工厂模式策略模式

目录

一 工厂模式

1.1 思想

1.2 案例

1.2.1 接口

1.2.2 实现类

1.2.3 工厂类

1.2.4 调用

二 策略模式

2.1 思想

2.2 案例

2.2.1 接口

2.2.2 实现类

2.2.3 策略类

2.2.4 调用

三  工厂模式+策略模式

3.1 思想

3.2 案例

3.2.1 接口

3.2.2 实现类

3.2.3  定义Factory

3.2.4 调试

一 工厂模式

1.1 思想

* 1.定义一个接口
* 2.定义一个实现类
* 3.定义一个根据传入参数,产生对象的工厂类
* 4.通过工厂类调用具体对象的方法

1.2 案例

1.2.1 接口

public interface BankInfo {
    public  void payMoney();
}

1.2.2 实现类

public class BocBank implements BankInfo{
    @Override
    public void payMoney() {
        System.out.println("中国银行取钱50元");
    }
}
public class IcbcBank implements BankInfo{
    @Override
    public void payMoney() {
        System.out.println("工商银行银行取钱50元");
    }
}

1.2.3 工厂类

public class ObjectFactory {
    public BankInfo buildObjectInfo(String str){
        if (str == null){
            return null;
        }
        else if ("boc".equals(str)) {
            return new BocBank();
        }
        else if ("icbc".equals(str)) {
            return new IcbcBank();
        }
        else {
            return null;
        }
    }
}

1.2.4 调用

/**
 * @ClassName: TestFt
 * @Description: TODO
 * @Author: admin
 * 1.定义一个接口
 * 2.定义一个实现类
 * 3.定义一个根据传入参数,产生对象的工厂类
 * 4.通过工厂类调用具体对象的方法
 *
 *
 * @Date: 2024/08/01 20:56:05 
 * @Version: V1.0
 **/
public class TestFt {
    public static void main(String[] args) {
        ObjectFactory objectFactory = new ObjectFactory();
        BankInfo bankInfoBank =  objectFactory.buildObjectInfo("icbc");
        bankInfoBank.payMoney();
    }
}

二 策略模式

2.1 思想

 1.定义一个策略接口,在接口中声明一个行为方法
* 2.定义多个策略实现类,并实现策略接口,重写行为方法,实现各自逻辑
* 3.定义一个context上下文,用于调用具体的策略方法,供客户端使用;通过new context的构造函数传入策略对象,然后通过此对象调用策略行为方法。

2.2 案例

2.2.1 接口

public interface BankInfo {
    public void payMoney(int a,int b);
}

2.2.2 实现类

public class BocBank implements BankInfo{
    @Override
    public void payMoney(int a,int b) {
       System.out.println("中国银行,累加:"+(a+b));
    }
}
public class IcbcBank implements BankInfo{
    @Override
    public void payMoney(int a, int b) {
        System.out.println("中国工商银行,扣减:"+(a-b));
    }
}

2.2.3 策略类

public class StaragePattern {
    private BankInfo bankInfo;
    public StaragePattern(BankInfo bankInfo) {
       this. bankInfo = bankInfo;
    }
    public  void  contextInfo(int a,int b){
        bankInfo.payMoney(a,b);
    }
}

2.2.4 调用

/**
 * @ClassName: TestS
 * @Description: TODO
 * 1.定义一个策略接口,在接口中声明一个行为方法
 * 2.定义多个策略实现类,并实现策略接口,重写行为方法,实现各自逻辑
 * 3.定义一个context上下文,用于调用具体的策略方法,供客户端使用;通过new context的构造函数传入策略对象,然后通过此对象调用策略行为方法。
 * https://zhuanlan.zhihu.com/p/680317010
 * @Author: admin
 * @Date: 2024/08/02 11:28:34 
 * @Version: V1.0
 **/
public class TestS {
    public static void main(String[] args) {
//        StaragePattern staragePattern = new StaragePattern(new BocBank());
//        staragePattern.contextInfo(30,20);
    }
}

三  工厂模式+策略模式

3.1 思想

1.定义接口实现InitializingBean,重写 void afterPropertiesSet(),在服务启动时候,自动执行子类中的afterPropertiesSet()方法。

3.2 案例

3.2.1 接口

public interface HandlerStrategyFactory  extends InitializingBean {
    void getCoca(String parameter);
}

3.2.2 实现类

@Component
public class CocaHandlerV2 implements HandlerStrategyFactory{
    @Override
    public void getCoca(String parameter)
    {
        System.out.println("我是可口可乐-策略+工厂 "+parameter);
    }

    @Override
    public void afterPropertiesSet() throws Exception
    {
        //K          //V
        Factory.register("Coca",this);
    }
}
@Component
public class PepsiHandlerV2 implements HandlerStrategyFactory{
    @Override
    public void getCoca(String parameter)
    {
        System.out.println("我是百事可乐-策略+工厂 "+parameter);
    }

    @Override
    public void afterPropertiesSet() throws Exception
    {
        Factory.register("Pepsi",this);
    }
}

3.2.3  定义Factory

public class Factory {
    private static Map<String, HandlerStrategyFactory> strategyMap = new ConcurrentHashMap<>();

    public static HandlerStrategyFactory getInvokeStrategy(String str)
    {
        return strategyMap.get(str);
    }

    public static void register(String str ,HandlerStrategyFactory handler)
    {
        System.out.println("str: "+str+"\t handler: "+handler);
        if (null == str || null == handler)
        {
            return;
        }
        strategyMap.put(str,handler);
    }
}

3.2.4 调试

@SpringBootTest
public class DesignPatternTest
{
    /**
     * 策略+工厂V2
     */
    @Test
    public void methodV2()
    {
        String parameter = "Coca";

        HandlerStrategyFactory invokeStrategy = Factory.getInvokeStrategy(parameter);

        invokeStrategy.getCoca(parameter);
    }
}

结果图:


http://www.kler.cn/news/368215.html

相关文章:

  • C++STL之stack
  • 【程序员的逆袭】:在失业的阴影下寻找光明
  • Flink-cdc Schema Evolution 详解
  • SwiftUI(三)- 渐变、实心形状和视图背景
  • 研究生论文学习记录
  • Spring Boot框架下的酒店住宿登记系统
  • vue3组件通信--自定义事件
  • Spring Boot Configuration和AutoConfiguration加载逻辑和加载顺序调整
  • MySQL 9从入门到性能优化-慢查询日志
  • 智能财务 | 数据与融合,激发企业财务数智化转型思考
  • 华为odC++一面-面经总结
  • CTF-WEB-PHP魔法函数
  • NVR接入录像回放平台EasyCVR视频融合平台语音对讲配置
  • 洛谷 P2760 科技庄园(多重背包,二进制优化)
  • Cyber Weekly #30
  • 【语音转文本新体验】Windows部署Whisper Web结合内网穿透轻松远程转录——“cpolar内网穿透”
  • python爬虫基础篇:文本操作和二进制存储
  • 31个省份农业科技水平(农业技术创新或农业科技专利数据)2010-2022年
  • macport 多版本php快速切换自定义命令pvm shell脚本
  • java平方根计算 C语言指针变量
  • Mercury:一款网络元数据捕捉与安全分析工具
  • 计算机网络——有连接传输层协议TCP
  • 如何使用Qlik Sense Util
  • 使用 Cursor 和 Devbox 快速开发并上线 Gin 项目
  • ifftshift函数
  • 缓存放置文章调研