`

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

阅读更多

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

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

 

分享到:
评论

相关推荐

    工厂模式测试代码

    工厂模式和抽象工厂模式的对比,俩者的一些区别和相似

    算法设计与分析实验 寻找数据相似模式 源代码

    1)找哪些基因在哪些条件下具有相似模式。即找出哪些行的数据在哪些列上具有相似的模式(相似的行和列有一定的限制,不能太小),并图形化你的结果。 2) 找具有相反表达模式的基因,即找出哪些行在哪些列上具有相反...

    论文研究-基于涨落模式的时间序列相似性度量研究.pdf

    提出涨落模式(FP)的概念,以涨落模式保存原序列的趋势变化信息,利用最长公共子序列算法计算涨落模式的相似度,消除振幅伸缩、振幅漂移和线性漂移等对相似性挖掘带来的影响,实现基于涨落模式的时间序列相似性度量...

    23种设计模式的C++实现.rar

    创建型模式,共五种:​​单例模式​​、​​原型模式​​、​​工厂方法模式​​、​​抽象工厂模式​​、​​建造者模式​​。 结构型模式,共七种:​​适配器模式​​、​​装饰器模式​​、​​代理模式​​、...

    饮料商城系统源代码和报告(本次实验要求使用几种特定的设计模式,完成业务功能完整的应用程序)

    (1)原型模式。当需要大量相同或相似的对象时,原型模式是最佳选择。原型模式通过在内存中复制对象,比直接创建新对象更...在本系统中,抽象工厂模式的实现涉及到可乐生产工厂类、百事可乐类、可口可乐类等。 (4)

    JavaScript的设计模式经典之代理模式

    说明:顾名思义就是用一个类来代替另一个类来执行方法功能,这个模式跟装饰模式有点相似,不一样的是,代理模式是代替客户初始化被代理对象类,而装饰模式采用接口或初装饰者参数引用的方式来执行的。 解释:房屋...

    设计模式_组合模式.zip

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的...

    java设计模式之工厂方法模式

    java设计模式之工厂方法模式 学习设计模式已经有一段时间了,但经常还是会很困惑。看书上的代码会发现很多不同的设计模式的代码结构非常相似。比如 Bridge 和 Strategy 。。。 设计模式就是我们设计过程中经常出现的...

    解析iOS应用开发中对设计模式中的抽象工厂模式的实现

    通过使用抽象工厂模式,可以处理具有相同(或者相似)等级结构中的多个产品族中的产品对象的创建问题。如下图所示: 根据产品角色的结构图,就不难给出工厂角色的结构设计图。 可以看出,每一个工厂角色都有两个工厂...

    从模式讲到设计模式再到面向对象设计模式

    众所周知,从结构可以看出,简单工厂模式中的工厂依赖于所有的子类产品,客户只需知道父类产品和工厂即可。工厂是整个模式的核心,以不变应万变。它虽然使对象的创建与使用进行了分离,但一次只能创建一个对象。它...

    论文研究-交通流时间序列模式相似性度量法.pdf

    针对交通流时间序列具有高维、高噪声的特性,设计了基于趋势变动、拟合...以上海南北高架东侧间部分路段固定线圈检测数据为例进行了实证分析,最终确定模式距离与欧氏距离组合方式为交通时序模式相似性度量的最佳方法。

    模糊模式识别的基础——相似度量.pdf

    模糊模式识别的基础——相似度量.pdf 模糊模式识别的基础——相似度量.pdf

    基于模式形态距离的桥梁监测测点相似性聚类研究

    为挖掘桥梁检测各测点之间的相似关系,提出基于模式形态距离的时间序列相似性度量方法。该方法首先根据监测时间序列的形态特征将序列划分成若干模式,然后以各模式形态的动态变化趋势差异为依据进行相似性的判别,并...

    uml 文档 策略模式

    模式概述 策略模式(Strategy Pattern)在外形上与状态模式很相似,但在意图上有些不同。其意图是使这些算法可以相互替换,并提供一种方法来选择最合适的算法。

    对比Java设计模式编程中的状态模式和策略模式

    主要介绍了Java设计模式编程中的状态模式和策略模式对比,文中列举了两种模式的相似点和不同点,并都举了代码的实例作为参照,需要的朋友可以参考下

    网络信息审计系统中的多模式相似匹配算法

    计算机程序设计艺术1网络信息审计系统中的多模式相似匹配算法

    从实例谈面向对象编程、工厂模式和重构

    现在该设计模式粉墨登场了,这种根据不同情况创建不同类型的方式,工厂模式是最拿手的。先看看我们 的工厂需要生产哪些产品呢?虽然这里有两种不同类型的媒体AudioMedia 和 VideoMedia(以后可能更 多),但它们同时...

    java设计模式【之】适配器模式【源码】【场景:水和容器】

    java设计模式【之】适配器模式【源码】【场景:水和容器】 * 适配器模式,类似(亡羊补牢) * 已经存在的类(功能已经开发完成了),与新需求的功能相似,但是略有差异 * 当已经存在的方法无法满足现有需求,需要...

    数据库的几种设计模式

    主扩展模式,通常用来将几个相似的对象的共有属性抽取出来,形成一个“公共属性表”;其余属性则分别形成“专有属性表”,且“公共属性表”与“专有属性表”都是“一对一”的关系

Global site tag (gtag.js) - Google Analytics