`
wangdongsong
  • 浏览: 35941 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

学习设计模式系列之——简单工厂模式(Java)

阅读更多

一、简单工厂模式简介
    简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
举例说明:

第一步:有一苹果类和香蕉类,里面有同样的摘去方法get(),代码如下:

package com.wds.simplefactory;

/** 
 * 香蕉类
 * 2010-6-26 下午09:46:59
 */
public class Banana{

	/**
	 * 采集
	 * 2010-6-26 下午09:47:16
	 */
	public void get(){
		System.out.println("采集香蕉");
	}
}

 苹果类如下:

/** 
 * 草果类
 * 2010-6-26 下午09:45:41
 */
public class Apple{
	
	/**
	 * 采集苹果
	 * 2010-6-26 下午09:46:20
	 */
	public void get(){
		System.out.println("采集苹果");
	}

}

 主类MainClass:

/** 
 * 主类
 * 2010-6-26 下午09:45:29
 */
public class MainClass {
	

	/**
	 * 2010-6-26 下午09:45:29
	 * @param args
	 */
	public static void main(String[] args) {
		/*
		 * 实例化一个Apple
		 */
		Apple apple=new Apple();
		
		/*
		 * 实例化一个Banana
		 */
		Banana banana=new Banana();
		
		apple.get();
		banana.get();
              }
}

 

第二步: 以前是第一部,完成了一个初步的操作,但是由苹果和香蕉这两个类中都一个采摘的方法get(),,所以我们从这两个类中抽取一个Fruit接口,代码如下:

/** 
 * Fruit接口
 * 2010-6-26 下午09:50:57
 */
public interface Fruit {

	/**
	 * 摘取
	 */
	public void get();
	
}

 

那么苹果类和香蕉类实现Fruit接口,代码如下:

/** 
 * 苹果类
 * 2010-6-26 下午09:45:41
 */
public class Apple implements Fruit{
	
	/**
	 * 采集苹果
	 * 2010-6-26 下午09:46:20
	 */
	public void get(){
		System.out.println("采集苹果");
	}
}

 

/** 
 * 香蕉类
 * 2010-6-26 下午09:46:59
 */
public class Banana implements Fruit{

	/**
	 * 采集
	 * 2010-6-26 下午09:47:16
	 */
	public void get(){
		System.out.println("采集香蕉");
	}
}

 

主类中关于Apple和Banana的实例有所变化,代码如下:

/** 
 * 主类
 * 2010-6-26 下午09:45:29
 */
public class MainClass {
	

	/**
	 * 2010-6-26 下午09:45:29
	 * @param args
	 */
	public static void main(String[] args) {

		//采用接口实例化一个Apple
		Fruit apple=new Apple();
		//采用接口实例化一个Banana
		Fruit banana=new Banana();
		apple.get();
		banana.get();

                }
}

 

第三步:由于Apple和Banana有一个共同的接口,而简单工厂模式,是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。所以我们创建一个水果工厂类FruitFactory来创建Apple和Banana这两个类。

FruitFactory代码如下:

/** 
 * 水果工厂类
 * 2010-6-26 下午09:53:48
 */
public class FruitFactory {
	
	/**
	 * 获得Apple类的一个实例
	 */
	public static Fruit getApple(){
		return new Apple();
	}
	
	/**
	 * 获得一个Banana的一个实例
	 * 2010-6-26 下午09:54:47
	 * @return
	 */
	public static Fruit getBanan(){
		return new Banana();
	}
}

 那么主类就有相就的变化,代码如下

MainClass

/** 
 * 主类
 * 2010-6-26 下午09:45:29
 */
public class MainClass {
	

	/**
	 * 2010-6-26 下午09:45:29
	 * @param args
	 */
	public static void main(String[] args) {
                             	Fruit apple=FruitFactory.getApple();
		Fruit banana=FruitFactory.getBanan();
		apple.get();
		banana.get();
               }
}

 
第四步,由于在工厂类中,都是一个get方法,只是返回内容不同,我们换另一种方法,只有get方法一个,根据参数不同决定返回的类不同,FruitFactory代码如下:

/** 
 * 水果工厂类
 * 2010-6-26 下午09:53:48
 */
public class FruitFactory {
	/**
	 * get方法,获得所有产品对象
	 * 异常我人为的忽略了,大家在写的时候加上去
	 */
	public static Fruit getFruit(String type){
		if(type.equalsIgnoreCase("apple")){
			return Apple.class.newInstance();
		}else if(type.equalsIgnoreCase("banana")){
			return Banana.class.newInstance();
		}else{
			System.out.println("can not find class");
			return null;
		}
}

 第五步,由于水果工厂类中的判断语句比较多,我们换一个更为普通的创建方法,代码如下:

/** 
 * 水果工厂类
 * 2010-6-26 下午09:53:48
 */
public class FruitFactory {
	/**
	 * get方法,获得所有产品对象
	 * @throws ClassNotFoundException 
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 */
	public static Fruit getFruit(String type) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
                                //此处,之所以加com.wds.simplefacotry,是因为Apple类和Banana类与FruitFactory类同个包下面,包的名字是com.wds.simplefactory
		Class fruit=Class.forName("com.wds.simplefactory."+type);
		//System.out.println(FruitFactory.class.getResource(""));
		//Class fruit=Class.forName(FruitFactory.class.getClassLoader().getResource("")+type);
		return (Fruit) fruit.newInstance();

	}
}

 至此,工厂类已经完成,那么主类代码也有所变化,变化如下:

/** 
 * 主类
 * 2010-6-26 下午09:45:29
 */
public class MainClass {
	

	/**
	 * 2010-6-26 下午09:45:29
	 * @param args
	 */
	public static void main(String[] args) {
		try {
		               Fruit banana=FruitFactory.getFruit("Banana");
	                               Fruit apple = FruitFactory.getFruit("Apple");
			apple.get();
			banana.get();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
}

 

分享到:
评论
1 楼 mercyblitz 2010-06-28  
不错 ,我有两点建议:

1.
if(type.equalsIgnoreCase("apple")){  


建议写成"apple".equalsIgnoreCase(type),这样可以防止NPE(NullPointerException)。


2.
public void get();  


建议改成
public String get();  
,这样API的动词方法不会产生歧义。

我有一篇文章说到这个的,你有时间可以参考一下:
http://mercyblitz.iteye.com/blog/667939

相关推荐

    设计模式——简单工厂模式

    **设计模式——简单工厂模式** 简单工厂模式是创建型设计模式的一种,它提供了一种创建对象的最佳方式。在简单工厂模式中,一个专门的类(称为工厂类)负责创建对象,客户端无需知道所创建的对象的具体类,只需要...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与应用,特别是针对刘伟教授的相关课程的课后习题及模拟试题的解答。 设计模式分为三大类:创建型、结构型和行为型模式。...

    设计模式——工厂方法模式

    工厂方法模式是面向对象设计模式中的一种,它属于创建型模式,主要解决的是当系统需要创建的对象具有多种类型,而具体创建哪种类型的对象在运行时才能确定的问题。在这个压缩包中,`FactoryMethod`可能包含了Java...

    设计模式-Java语言中的应用(pdf)

    通过深入学习《设计模式——Java语言中的应用》,开发者能够更好地理解和应用这些模式,从而编写出更加高效、可扩展的Java程序。无论是初级开发者还是经验丰富的程序员,都应该不断探索和实践设计模式,以提升自己的...

    Java设计模式源代码——自己看pdf写的

    以上只是部分Java设计模式的介绍,实际的“DesignPatterns”压缩包可能包含了这些模式的源代码实现,通过阅读和学习这些代码,开发者可以更好地理解和运用设计模式,提升代码质量。同时,结合博主提供的博客链接,...

    设计模式——工厂模式在开发中的应用(简单计算器)

    这个是http://blog.csdn.net/dawanganban/article/details/9884681博客中java设计模式的源代码。下载前请先看《设计模式——工厂模式在开发中的应用》一文。

    设计模式实现——抽象工厂模式结构实现

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。这种模式允许客户端使用一个通用接口来创建一组相关或相互依赖的对象,而无需关心它们的具体实现。在Java或其他...

    java设计模式之——策略模式

    在实际应用中,策略模式可以与其他设计模式结合使用,如工厂模式用于创建策略对象,或者使用组合模式来组织多个策略。同时,策略模式也可以用于替代继承,避免由于类的层次过多而导致的复杂性。 在阅读《Effective ...

    Java设计模式-简单工厂

    **Java设计模式——简单工厂** 简单工厂模式是软件设计模式中的一种基础模式,它属于创建型设计模式。在Java编程中,我们常常会遇到需要创建一系列相关或相互依赖的对象,而这些对象的创建过程可能会非常复杂。这时...

    《Java设计模式》刘伟 课后习题及模拟试题答案.rar

    《Java设计模式》是刘伟老师的一本经典教材,它深入浅出地讲解了软件设计中的重要概念——设计模式。设计模式是经验丰富的开发者在解决常见问题时总结出的通用解决方案,是软件开发中的智慧结晶。这本书的课后习题和...

    java23种设计模式——图解——附带源码

    以上两种创建型模式,即工厂方法模式和抽象工厂模式,是Java设计模式中非常重要的一部分,它们可以帮助开发者更好地管理对象的创建过程,提高系统的灵活性和可扩展性。接下来的部分将继续探讨其他的设计模式。

    Java设计模式——工厂设计模式详解

    Java设计模式——工厂设计模式详解 在软件设计中,工厂设计模式是一种常用的设计模式,主要用于实例化有共同接口的类。Java设计模式——工厂设计模式是Java中的一种常用的设计模式,主要用于实例化有共同接口的类。...

    JAVA 设计模式 工厂模式 代理模式 迭代模式 责任链模式 源码

    以下是关于JAVA设计模式中提及的四种模式——工厂模式、代理模式、迭代器模式以及责任链模式的详细说明。 1. **工厂模式**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建...

    Java与模式——源码

    《Java与模式——源码》这个主题涉及到的是Java编程语言中的设计模式应用,以及如何通过源代码来理解和学习这些模式。设计模式是软件工程中的一种最佳实践,它们是解决常见问题的经验总结,使得代码更易读、易维护、...

    JAVA设计模式.chm

    本资源“JAVA设计模式.chm”聚焦于一种重要的设计模式——工厂模式。工厂模式是面向对象设计中的一种经典模式,它在Java程序中扮演着核心角色。 工厂模式的核心思想是提供一个创建对象的接口,但让实现这个接口的类...

    深入浅出设计模式四——比萨店生产比萨实现(工厂方法模式)

    在IT行业中,设计模式是软件开发中的重要概念,它们代表了在特定场景下解决常见问题的最佳实践。本文将深入探讨“工厂方法模式”,并结合比萨店生产比萨的实例来解析这一模式的运用。首先,我们要理解工厂方法模式的...

    设计模式——JAVA.docx

    ### JAVA设计模式总结之23种设计模式及六大原则 #### 一、设计模式之六大原则 ##### 总原则:开闭原则(Open Close Principle) 开闭原则是设计模式中最核心的原则之一,它强调的是软件实体(类、模块、函数等)...

    Java设计模式简单工厂模式

    **Java设计模式——简单工厂模式** 简单工厂模式是软件设计模式中的创建型模式之一,它提供了一种创建对象的最佳方式。在简单工厂模式中,一个专门的类(工厂类)负责创建其他类的实例,客户端通过工厂类来获取所需...

Global site tag (gtag.js) - Google Analytics