模式设计学习——工厂设计与策略设计

模式设计学习——工厂设计与策略设计



前言

记录笔者在工作学习中总结的知识点,如有需要完善之处欢迎留言评论指导。


一、工厂模式与策略模式是什么?

1.工厂模式定义:工厂模式是是 Java 中最常用的设计模式之一,是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式,属于创建型模式。
2.策略模式定义:在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

二、实现

1.工厂模式

代码如下(示例):

步骤一
创建一个接口。

public interface People {

    void firstGear();

    void secondGear();

    void thirdGear();
}

步骤二
创建实现接口的实体类。

LuFei.java
public class LuFei implements People{

    private static final String roleName = "路飞";

    @Override
    public void firstGear() {
        System.out.println(roleName + ":----橡胶手枪----");
    }

    @Override
    public void secondGear() {
        System.out.println(roleName + ":----橡胶火箭----");
    }

    @Override
    public void thirdGear() {
        System.out.println(roleName + ":----尼卡变身----");
    }
}
KaiDuo.java
public class KaiDuo implements People{

    private static final String roleName = "兽王凯多";

    @Override
    public void firstGear() {
        System.out.println(roleName + ":----雷鸣八卦----");
    }

    @Override
    public void secondGear() {
        System.out.println(roleName + ":----热息----");
    }

    @Override
    public void thirdGear() {
        System.out.println(roleName + ":----最强之力----");
    }
}
SuoLong .java
public class SuoLong implements People{
    private static final String roleName = "索隆";

    @Override
    public void firstGear() {
        System.out.println(roleName + ":----一刀流居合 狮子歌歌----");
    }

    @Override
    public void secondGear() {
        System.out.println(roleName + ":----二刀流 居合 罗生门----");
    }

    @Override
    public void thirdGear() {
        System.out.println(roleName + ":----三刀流奥义 三千世界----");
    }
}

步骤 3
创建一个工厂,生成基于给定信息的实体类的对象。

PeopleFactory.java
public class PeopleFactory {

    public People getPeople(String peopleType) {
        if (peopleType == null) {
            return null;
        }
        if(peopleType.equalsIgnoreCase("LuFei")){
            return new LuFei();
        } else if(peopleType.equalsIgnoreCase("KaiDuo")){
            return new KaiDuo();
        } else if(peopleType.equalsIgnoreCase("SuoLong")){
            return new SuoLong();
        }
        return null;
    }
}

步骤 4
使用该工厂,通过传递类型信息来获取实体类的对象。

FactoryPatternDemo.java
public class FactoryPatternDemo {

    public static void main(String[] args) {
        PeopleFactory peopleFactory = new PeopleFactory();

        //获取 LuFei 的对象,并调用它的 firstGear 方法
        People luFei = peopleFactory.getPeople("LuFei");

        //调用 LuFei 的 firstGear 方法
        luFei.firstGear();

        //获取 KaiDuo 的对象,并调用它的 firstGear 方法
        People kaiDuo = peopleFactory.getPeople("KaiDuo");

        //调用 KaiDuo 的 firstGear 方法
        kaiDuo.firstGear();

        //获取 SuoLong 的对象,并调用它的 firstGear 方法
        People suoLong = peopleFactory.getPeople("SuoLong");

        //调用 SuoLong 的 firstGear 方法
        suoLong.firstGear();
    }
}

运行结果:

路飞:----橡胶手枪----
兽王凯多:----雷鸣八卦----
索隆:----一刀流居合 狮子歌歌----

2.策略模式

代码如下(示例):
步骤一、步骤二如同工厂模式,我们直接开始步骤三。

步骤三
创建 Context 类。

Context.java
public class Context {
    private People people;

    public Context(People people){
        this.people = people;
    }

    public Context(String name){
        if(name.equals("LuFei")){
            this.people = new LuFei();
        }else if(name.equals("KaiDuo")){
            this.people = new KaiDuo();
        }else if(name.equals("SuoLong")){
            this.people = new SuoLong();
        }
    }

    public void run(){
        people.firstGear();
        people.secondGear();
        people.thirdGear();
    }
    
}

步骤四
使用 Context 来查看当它改变策略 Strategy 时的行为变化。

StrategyPatternDemo.java
public class StrategyPatternDemo {

    public static void main(String[] args) {
        Context luContext = new Context("LuFei");
        Context kaiContext = new Context("KaiDuo");
        Context suoContext = new Context("SuoLong");
        System.out.print("路飞释放技能" ); luContext.run();
        System.out.print("索隆释放技能" ); suoContext.run();
        System.out.print("凯多抵挡" ); kaiContext.run();
    }
}

运行结果:

路飞释放技能路飞:----橡胶手枪----
路飞:----橡胶火箭----
路飞:----尼卡变身----
索隆释放技能索隆:----一刀流居合 狮子歌歌----
索隆:----二刀流 居合 罗生门----
索隆:----三刀流奥义 三千世界----
凯多抵挡兽王凯多:----雷鸣八卦----
兽王凯多:----热息----
兽王凯多:----最强之力----

总结

简单来说工厂模式是可以让使用对象的人去避免创建对象,工厂把对象给你了,你只管使用就可以了,而不必管这些对象究竟如何创建及如何组织的。

策略模式就是根据用户提供的策略,在不同的场景中,该行为有不同的实现算法。策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码。缺点是用户必须知道所有的策略类,可以通过和工厂模式来结合使用,不过也有弊端,并且每个策略都需要一个策略类,策略一多类也就非常多了。以前使用DBUtils时候传入不同的参数然后就可以有不同的封装方式返回object或者list就是就是的策略模式。

借鉴链接:
链接: 菜鸟教程.
个人理解简单工厂模式和策略模式的区别.

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值