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中不用更改,但它的客户端的代码就要更改了,其实实际使用中并不一定分的这么清楚,具体情况具体对待,实际使用中经常是多种模式组合使