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

目录

[一 工厂模式](#一 工厂模式)

[1.1 思想](#1.1 思想)

[1.2 案例](#1.2 案例)

[1.2.1 接口](#1.2.1 接口)

[1.2.2 实现类](#1.2.2 实现类)

[1.2.3 工厂类](#1.2.3 工厂类)

[1.2.4 调用](#1.2.4 调用)

[二 策略模式](#二 策略模式)

[2.1 思想](#2.1 思想)

[2.2 案例](#2.2 案例)

[2.2.1 接口](#2.2.1 接口)

[2.2.2 实现类](#2.2.2 实现类)

[2.2.3 策略类](#2.2.3 策略类)

[2.2.4 调用](#2.2.4 调用)

[三 工厂模式+策略模式](#三 工厂模式+策略模式)

[3.1 思想](#3.1 思想)

[3.2 案例](#3.2 案例)

[3.2.1 接口](#3.2.1 接口)

[3.2.2 实现类](#3.2.2 实现类)

[3.2.3 定义Factory](#3.2.3 定义Factory)

[3.2.4 调试](#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);
    }
}

结果图:

相关推荐
小白不太白9505 小时前
设计模式之建造者模式
java·设计模式·建造者模式
菜菜-plus6 小时前
java 设计模式 模板方法模式
java·设计模式·模板方法模式
萨达大7 小时前
23种设计模式-模板方法(Template Method)设计模式
java·c++·设计模式·软考·模板方法模式·软件设计师·行为型设计模式
机器视觉知识推荐、就业指导8 小时前
C++设计模式:原型模式(Prototype)
c++·设计模式·原型模式
阳光开朗_大男孩儿8 小时前
组合模式和适配器模式的区别
设计模式·组合模式·适配器模式
MinBadGuy9 小时前
【GeekBand】C++设计模式笔记13_Flyweight_享元模式
c++·设计模式
Clang's Blog10 小时前
23种设计模式详解(以Java为例)
java·开发语言·设计模式
程序员奇奥10 小时前
设计模式——简单工厂模型、工厂模式、抽象工厂模式、单例模式、代理模式、模板模式
单例模式·设计模式·抽象工厂模式
hxj..11 小时前
【设计模式】代理模式
java·设计模式·代理模式·动态代理
十五年专注C++开发11 小时前
C++不完整类型(Incomplete Type)的检测与避免
开发语言·c++·算法·设计模式