java策略模式和工厂模式的区别

Python037

java策略模式和工厂模式的区别,第1张

工厂模式是创建型模式

策略模式是行为性模式

一个关注对象创建

一个关注行为的封装

策略模式就是定义一系列的算法,这些算法可以在需要的时候替换和扩展.工厂模式是生成型的模式,在你需要的时候构建具体的实例.

在下面的情况下应当考虑使用策略模式:

1. 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

2.

一个系统需要动态地在几种算法中选择一种。那么这些算法可以包装到一个个的具体算法类里面,而这些具体算法类都是一个抽象算法类的子类。换言之,这些具体

算法类均有统一的接口,由于多态性原则,客户端可以选择使用任何一个具体算法类,并只持有一个数据类型是抽象算法类的对象。

3. 一个系统的算法使用的数据不可以让客户端知道。策略模式可以避免让客户端涉及到不必要接触到的复杂的和只与算法有关的数据。

4. 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。此时,使用策略模式,把这些行为转移到相应的具体策略类里面,就可以避免使用难以维护的多重条件选择语句,并体现面向对象设计的概念。

策略模式的优点和缺点

策略模式有很多优点和缺点。它的优点有:

1. 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免重复的代码。

2.

策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提

供一个不同的算法或行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑

混合在一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。

3. 使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。

策略模式的缺点有:

1. 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。

2. 策略模式造成很多的策略类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。

策略模式与很多其它的模式都有着广泛的联系。Strategy很容易和Bridge模式相混淆。虽然它们结构很相似,但它们却是为解决不同的问题

而设计的。Strategy模式注重于算法的封装,而Bridge模式注重于分离抽象和实现,为一个抽象体系提供不同的实现。Bridge模式与

Strategy模式都很好的体现了"Favor composite over inheritance"的观点。

我认为策略模式是java众多模式中最常用,最常见的一种模式。

一句话说,针对同一命令(或行为),不同的策略做不同的动作。 (个人总结 难免疏漏 海涵)

举例来说,一个接口有两个实现:

interface RunBehavior {

public void performRun()

}

class Run implements RunBehavior {

public void performRun() { System.out.println(" I can run!")}

}

class JumpAsRun implements RunBehavior {

public void performRun() { System.out.println("I cannot run, but I can jump!")}

}

解释一下这段简单的程序

跑是一种行为(接口)

正常的动物都可以跑(class Run)

麻雀是不能跑的,它只能跳(class JumpAsRun)

这样的话,其实我们有了一个行为的请求,那就是跑,然后我们有两个策略供选择。

那么如何调用呢?

class Anmial {

RunBehavior runBehavior

public void run() {

this.runBehavior.performRun()

}

public void setRunBehavior(RunBehavior runBehavior) {

this.runBehavior = runBehavior

}

}

下面真正开始调用:

public class TestStrategy{

public static void main(String args[]) {

RunBehavior rb1 = new Run()

Animal tiger = new Animal()

tiger.setRunBehavior(rb1)

tiger.run()

RunBehavior rb2 = new JumpAsRun()

Animal bird = new Animal()

bird.setRunBehavior(rb2)

bird.run()

// 上面的老虎和鸟分别用了一个策略,下面让老虎用鸟的策略

// 看看会发生什么

tiger.setRunBehavior(rb2)

tiger.run()

// 其实策略模式的重点就在这儿,给对象传入什么样的策略,执行什么样的动作。

}

}

具体的还要你自己多思考了,推荐《Head First Desigh Pattern》

全手工敲入代码,估计你需要微调如果想运行的话

这2者

根本就不能

谈什么区别。。。

完全不是一回事

策略模式:

多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。

代理模式

对其他对象提供一种代理以控制对这个对象的访问。