设计模式随笔-策略模式与简单工厂的区别

1. 概述

策略模式:策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理

简单工厂:专门负责将大量有共同接口的类实例化

两个模式的大概思路没有怎么变,都是通过多态去减少代码的耦合度


2. 结构

策略模式


简单工厂



3. 具体例子

策略类以及产品类就不说了,实现方式都是一样的:抽象父类,具体实际类。唯一不同的是:策略类的场景类与简单工厂的工厂类。

策略类的场景类不负责类的创建(具体实现在客户端),但是简单工厂类需要创建具体的类。

自我理解: 策略类具体类的实现是客户端(调用者)需要自己去创建的,而简单工厂是工厂类已经创建好了具体的类,客户端不需要知道怎么创建,策略类客户端需要知道具体类的类名, 工厂类不需要,只需要知道创建类的标志字段。 通过下面类直接看不同


策略类的场景类

public class Context {  
      
    //持有一个具体的策略对象  但是不负责生成,需要客户端生成
    private IRequest request;  
  
      
    public IRequest getRequest() {  
        return request;  
    }  
  
    public void setRequest(IRequest request) {  
        this.request = request;  
    }  
      
    public IResponse sendRequest(){  
        return this.request.sendRequest(this.request);  
    }  
      
  
}  



简单工厂的工厂类


public class SimpleFactory{
        //    此处需要定义 static 类型,在客户端 类名。方法调用
    public staitc Fruit getFruitObj(String type){
        Fruit obj = null;
     if(type.equals("apple")){
		obj = (Fruit) new Apple(); //工厂类复制具体类的实例,客户端只需要知道 "apple"这个类的标志即可

	}else if(type.equals("straw")){
		obj= (Fruit) new Straw();
	}else if(type.equals("grape")){
		obj = (Fruit) new Grape();
	}
	return obj;
    }
}


策略模式的客户端使用

public class Client {  
      
    public static void main(String[] args){  
        
    Context context = new Context();  
 //第一种策略 
         context.setRequest(new RestfulRequestImpl());  //客户端需要知道具体类的雷鸣
 context.sendRequest(); 


        //第二种策略    
        context.setRequest(new ThriftRequestImpl("test"));  
 ThriftResponseImpl thrift = (ThriftResponseImpl) 
        context.sendRequest();           
 } }




工厂类的客户端使用

public class Client
{
    public staic void main(String args[]){
     Fruit fu =SimpleFactory.getfruitobj("apple"); //客户端不创建,只需要知道创建的类的标志信息
     fu.plant();

    }
    
}



4. 总结
在简单工厂中,如果增加了新类,那么这个工厂类也要随之更改。在策略模式中,虽然Context中不用更改,但它的客户端的代码就要更改了,其实实际使用中并不一定分的这么清楚,具体情况具体对待,实际使用中经常是多种模式组合使

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值