设计模式初体验——工厂模式

        上课要求编写一个程序,实现插入排序的递归实现和非递归实现的效率问题。想到直接写在main里面各种调用觉得是不是有点low了。最近无事拿着设计模式的书在翻,突然想到了有一个工厂模式,于是乎就借着这个机会实践实践。

       背景:使用java程序实现对插入排序的递归实现和非递归实现的效率的比较。

       首先创建一个MyInsertSort接口,这个接口里面其实就一个简单的sort方法

package l78z.insertSort;


public interface MyInsertSort
{
	public void sort(int [] array,int index,int length);
}
然后分别创建两个具体类,分别是使用递归方式实现的插入排序,和使用非递归方式实现的插入排序(ps:具体的事件是从百度拷贝的)

/**
* @Title: RecursiveImplemnt.java
* @Package l78z.insertSort
* @Description: TODO(用一句话描述该文件做什么)
* @author matao@cqrainbowsoft.com
* @date 2015年11月26日 下午4:51:23
* @version V1.0
*/
package l78z.insertSort;


public class RecursiveImplemnt implements MyInsertSort
{

	/* (非 Javadoc) 
	* <p>Title: sort</p> 
	* <p>Description: </p> 
	* @param array
	* @param index
	* @param length 
	* @see l78z.insertSort.MyInsertSort#sort(int[], int, int) 
	*/
	@Override
	public void sort(int[] array, int index, int length)
	{
		if (index >= length)  
	    {  
	        return;  
	    }  
	  
	    int key = array[index];//记录当前待插入的元素    
	    int i=0;  
	    for (i=index-1; i>=0&&key<array[i]; i--)  
	    {  
	        array[i+1] = array[i];          
	    }  
	    array[i+1] = key;  
	    sort(array, index+1, length);  
	}
	
}
/**
* @Title: UnrecuisiveImplement.java
* @Package l78z.insertSort
* @Description: TODO(用一句话描述该文件做什么)
* @author matao@cqrainbowsoft.com
* @date 2015年11月26日 下午4:52:00
* @version V1.0
*/
package l78z.insertSort;

public class UnrecuisiveImplement implements MyInsertSort
{

	/* (非 Javadoc) 
	* <p>Title: sort</p> 
	* <p>Description: </p> 
	* @param array
	* @param index
	* @param length 
	* @see l78z.insertSort.MyInsertSort#sort(int[], int, int) 
	*/
	@Override
	public void sort(int[] array, int index, int length)
	{
		if (array == null || length <= 0)  
	    {  
	        return;  
	    }  
	       
	    int key = 0;  
	    int j=0;  
	    for (int i=1; i<length; i++)  
	    {  
	        if (array[i] < array[i-1])//当前带插入的元素比有序序列的最后一个元素小  
	        {  
	           key = array[i];  
	           for (j=i-1; j>=0&&key<array[j]; j--)  
	           {  
	               array[j+1] = array[j];             
	           }  
	           array[j+1] = key;  
	        }  
	    }  
		
	}
	
}
        在创建了以上三个类之后,我们需要每个具体类对应的工程厂类,在创建对应的工厂类之前我们需要创建一个抽象的工厂,这个抽象类里面就一个简单的创建插入排序实例的接口,其他的也没什么

/**
* @Title: AbstarctFactory.java
* @Package l78z.insertSort
* @Description: TODO(用一句话描述该文件做什么)
* @author matao@cqrainbowsoft.com
* @date 2015年11月26日 下午4:54:13
* @version V1.0
*/
package l78z.insertSort;

public interface AbstarctFactory
{
	public MyInsertSort createInsertSort();
}
在创建了接口之后分别创建插入排序的递归实现的工厂类和非递归实现的工厂类

/**
* @Title: RecursiveFactory.java
* @Package l78z.insertSort
* @Description: TODO(用一句话描述该文件做什么)
* @author matao@cqrainbowsoft.com
* @date 2015年11月26日 下午4:55:12
* @version V1.0
*/
package l78z.insertSort;

public class RecursiveFactory implements AbstarctFactory
{
	/* (非 Javadoc) 
	* <p>Title: createInsertSort</p> 
	* <p>Description: </p> 
	* @return 
	* @see l78z.insertSort.AbstarctFactory#createInsertSort() 
	*/
	@Override
	public MyInsertSort createInsertSort()
	{
		return new RecursiveImplemnt();
	}
	
}
/**
* @Title: UnrcursiveFactory.java
* @Package l78z.insertSort
* @Description: TODO(用一句话描述该文件做什么)
* @author matao@cqrainbowsoft.com
* @date 2015年11月26日 下午4:56:19
* @version V1.0
*/
package l78z.insertSort;

public class UnrcursiveFactory implements AbstarctFactory
{

	/* (非 Javadoc) 
	* <p>Title: createInsertSort</p> 
	* <p>Description: </p> 
	* @return 
	* @see l78z.insertSort.AbstarctFactory#createInsertSort() 
	*/
	@Override
	public MyInsertSort createInsertSort()
	{
		// TODO Auto-generated method stub
		return new UnrecuisiveImplement();
	}
	
}
        完成以上的步骤那么我们的准备工作就全部做完了。

        1)一个抽象的产品类——MyInsertSort

        2)两个或多个的具体产品类——RecursiveImplemnt、UnrecuisiveImplement

        3)一个抽象的工厂类——AbstarctFactory

        4)两个或多个具体产品对应的工厂类——RecursiveFactory、UnrcursiveFactory

        然后我们再看我们的测试类

/**
* @Title: Main.java
* @Package l78z.insertSort
* @Description: TODO(用一句话描述该文件做什么)
* @author matao@cqrainbowsoft.com
* @date 2015年11月26日 下午4:56:59
* @version V1.0
*/
package l78z.insertSort;

import l78z.L78ZUtil;

public class Main
{
	/** 
	 * @Title: Main 
	 * @Description: TODO(这里用一句话描述这个方法的作用)  
	 */
	public static String clazz= "l78z.insertSort.UnrcursiveFactory";
	
	public static void main(String[] args)
	{
		try
		{
			AbstarctFactory factory = (AbstarctFactory)Class.forName(clazz).newInstance();
			MyInsertSort insertSort = factory.createInsertSort();
			test(insertSort,"非递归测试");//这里可以传一个参数
		} catch (Exception e)
		{
			e.printStackTrace();
		}
	}
	public static void test(MyInsertSort insertSort ,String label)
	{
		System.out.println(label);
		for (int i = 1000; i < 10000; i+=1000)
		{
			int [] array = L78ZUtil.generateIntArray(i);
			L78ZUtil.timeStart();
			insertSort.sort(array, 0, array.length);
			L78ZUtil.timeEnd();
			Long result = null;
			try
			{
				result = L78ZUtil.getTime();
			} catch (Exception e)
			{
				e.printStackTrace();
			}
			System.out.println("规模是 "+i+ " 用时为"+result);
		}
	}
}
        到这里就基本上大功告成了,这样就实现了即使我们改变了外部条件(我需要测试递归方法和非递归方法)我们也不需要更改java代码。

(ps:这里的clazz为了方便我就没有都xml文件了,正确的做法是在xml文件中读取我们需要测试的类,测试了递归方法之后只需要将xml文件中的clazz改成非递归方法对应的类那么我们就可以直接测试了)

        纯属新手体验,有什么不对的地方望指正


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值