`

简单工厂模式、代理模式、策略模式如此相似

阅读更多

最近,一直在看设计模式,感觉简单工厂模式、代理模式、策略模式、依赖注入在实现方式上简直是大同小异。有些可能侧重点不同。下面通过代码比较下他们之间的区别,pk下。

1、定义个接口

package com.cvicse.Ifruit;

/**
 * 水果接口
 * 
 */
public interface Fruit {
	/**
	 * 水果生长
	 */
	public void grow();

	/**
	 * 吃水果
	 */
	public void eat();
}

 

2、定义该接口的实现类

 

package com.cvicse.fruitImpl;

import com.cvicse.Ifruit.Fruit;

public class Apple implements Fruit {

	public void eat() {
		System.out.println("吃苹果!");
	}

	public void grow() {
		System.out.println("苹果在生长!");
	}
}

package com.cvicse.fruitImpl;

import com.cvicse.Ifruit.Fruit;

public class Orange implements Fruit {

	public void eat() {
		System.out.println("吃橘子!");
	}

	public void grow() {
		System.out.println("橘子在生长!");
	}
}

 3、定义最关键的部分,仔细观察他们的区别

    工厂方法类

package com.cvicse.factory;

import com.cvicse.Ifruit.Fruit;
import com.cvicse.fruitImpl.Apple;
import com.cvicse.fruitImpl.Orange;

/**
 * 静态工厂类
 */
public class FruitFactory {
	// 采用类的反射机制获取类的实例
	public static Fruit fruitFactory(Class clazz) {
		Fruit fruit = null;
		try {
			fruit = (Fruit) Class.forName(clazz.getName()).newInstance();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return fruit;
	}

	/**
	 * 正宗静态方法
	 * 
	 * @param type
	 * @return
	 */
	public static Fruit fruitFactory(String type) {
		Fruit fruit = null;
		if ("apple".equals(type)) {
			fruit = new Apple();
		} else if ("orange".equals(type)) {
			fruit = new Orange();
		}
		return fruit;
	}
}

    代理模式类

package com.cvicse.factory;

import com.cvicse.Ifruit.Fruit;
import com.cvicse.fruitImpl.Apple;

/**
 * 代理模式实现类
 * 
 */
public class FruitProxy implements Fruit {

	private Fruit fruit;

	public FruitProxy() {
		this.fruit = new Apple();
	}

	public FruitProxy(Fruit fruit) {
		this.fruit = fruit;
	}

	public void eat() {
		fruit.eat();
	}

	public void grow() {
		fruit.grow();
	}
}

    策略模式类

package com.cvicse.factory;

import com.cvicse.Ifruit.Fruit;

/**
 *策略模式实现
 */
public class StrategyContext {
	private Fruit fruit;

	public StrategyContext(Fruit fruit) {
		this.fruit = fruit;
	}

	public void eat() {
		fruit.eat();
	}

	public void grow() {
		fruit.grow();
	}
}

  策略模式和工厂模式结合

package com.cvicse.factory;

import com.cvicse.Ifruit.Fruit;
import com.cvicse.fruitImpl.Apple;
import com.cvicse.fruitImpl.Orange;

public class StrategyFacoty {
	private Fruit fruit;

	public StrategyFacoty(String type) {
		if ("apple".equals(type)) {
			this.fruit = new Apple();
		} else if ("orange".equals(type)) {
			this.fruit = new Orange();
		}
	}

	public void eat() {
		fruit.eat();
	}

	public void grow() {
		fruit.grow();
	}
}

 总结:在实现上他们很相似,但有条原则是趋向遵从的就是组合优先,继承随后。

 

分享到:
评论

相关推荐

    第四章:Spring AOP API 设计模式1

    10. **代理模式(Proxy)**:Spring AOP的核心就是代理模式,它创建了目标对象的代理,代理对象在调用实际目标方法之前/之后执行额外的逻辑(如日志、事务管理等),提供了对对象行为的扩展。 11. **模板方法模式...

    设计模式 设计模式 设计模式 设计模式

    1. 创建型模式:包括单例模式、工厂模式(简单工厂、工厂方法、抽象工厂)、建造者模式、原型模式。这类模式主要关注如何创建对象,减少对象创建过程中的耦合,使得对象的创建更加灵活。 2. 结构型模式:如代理模式...

    java设计模式.高清影印版

    包括单例模式、工厂模式、观察者模式、装饰器模式、代理模式、适配器模式、桥接模式、建造者模式、组合模式、享元模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、状态模式、策略模式、模板方法...

    C# 设计模式(用常用的设计模式编写C#程序)

    在C#中,可以使用简单工厂、工厂方法或者抽象工厂模式来适应不同层次的抽象。 三、观察者模式 观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到通知并自动更新。C#...

    设计模式23种类图

    - 抽象工厂模式(Abstract Factory):提供一个接口,用于创建相关或依赖对象的家族,而无需指定具体类。 - 建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。...

    设计模式 让你轻松理解设计模式,提高开发效率

    从创建型模式(如工厂模式、建造者模式)到结构型模式(如适配器模式、组合模式),再到行为型模式(如观察者模式、策略模式),每种模式都有其独特的应用场景和优点。掌握这些设计模式不仅有助于我们编写出更高质量...

    Java设计模式源代码

    其中包括适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式和享元模式。比如,装饰器模式可以在不修改原有类的基础上动态地为对象添加新的行为或职责。 3. **行为型模式**:这类模式主要关注对象...

    Java设计模式之禅

    1. 策略模式(Strategy Pattern):允许在运行时选择算法的行为,如书中提到的“锦囊妙计”例子,通过不同的策略应对不同的情形。 2. 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问,常...

    设计模式 23种设计模式PPT

    - 策略模式:定义一系列算法,并将每个算法封装起来,使它们可以相互替换,让算法的变化独立于使用它的客户。 - 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法...

    设计模式 高清 完整版

    - **行为型模式**:关注对象间的职责分配,如策略模式、模板方法模式、观察者模式、命令模式、迭代器模式、中介者模式、备忘录模式、状态模式、访问者模式和解释器模式。 #### 设计模式的价值 设计模式的价值不仅...

    几种常用的设计模式

    - 简单工厂模式(非23种设计模式之一):通过一个工厂类来创建对象,简化客户端代码。 - 工厂方法模式:定义一个创建对象的接口,让子类决定实例化哪一个类。 - 抽象工厂模式:提供一个接口,用于创建相关或依赖对象...

    设计模式学习笔记总结

    这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...

    主流设计模式用例(均可单独调试)Java编写

    例如,使用工厂模式可以隐藏对象创建的复杂性,而代理模式则可以用于延迟加载或者增加安全控制等。 在Java中实现设计模式,需要理解面向对象的基本原则,包括单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则...

    设计模式PPT---25种设计模式详解

    3. 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。 4. 建造者模式(Builder):将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。...

    软件架构模式的种类 三种模式

    策略模式让算法独立于使用它的客户而变化,适用于需要在运行时动态选择算法的场景。 4. **Composite(组合)模式**:此模式允许开发者将对象组合成树形结构以表示“部分-整体”的层次结构。Composite 模式使得用户...

    设计模式Delphi版.rar

    结构型模式则关注如何组合类和对象以构建更大的结构,例如适配器模式(Adapter)、装饰器模式(Decorator)和代理模式(Proxy)。行为型模式则关注对象之间的通信和责任分配,如观察者模式(Observer)、策略模式...

    C#设计模式(23种设计模式)

    抽象工厂模式提供了一个接口,用于创建一系列相关的或相互依赖的对象,而无需指定它们具体的类。这种方法非常适合于需要创建多个相关对象但希望保持高层模块与具体实现解耦的情况。在C#中,可以通过定义抽象基类或...

    c#设计模式`很好的书啊

    接着,书中会详细讲解各种常见的设计模式,包括创建型模式(如单例模式、工厂模式、抽象工厂模式等)、结构型模式(如适配器模式、代理模式、装饰器模式等)以及行为型模式(如观察者模式、策略模式、职责链模式等)...

    新版设计模式手册[C#].

    包括创建型模式(如单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式),结构型模式(如适配器模式、桥接模式、装饰器模式、组合模式、外观模式、享元模式、代理模式),以及行为型模式(如策略模式、...

Global site tag (gtag.js) - Google Analytics