`
wangdongsong
  • 浏览: 35251 次
  • 性别: 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

相关推荐

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

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

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

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

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

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

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

    java23种设计模式 工厂模式 ,抽象工厂,建造者模式,单态模式,原型模式

    简单工厂模式

    设计模式课程资料——简单工厂模式,使用Java实现,在eclipse进行编译

    Java设计模式 版本2

    Java设计模式,目录:前言,UML建模技术,深入浅出UML类图,从招式与内功谈起——设计模式概述,面向对象设计原则,工厂三兄弟之简单工厂模式,工厂三兄弟之工厂方法模式,工厂三兄弟之抽象工厂模式,确保对象的唯一...

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

    主要介绍了Java设计模式——工厂设计模式详解,具有一定参考价值,需要的朋友可以了解下。

    设计模式——JAVA.docx

    JAVA设计模式总结之23种设计模式 一:设计模式之六大原则 总原则:开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。 1.Abstract Factory(抽象工厂模式) 2.Adapter(适配器模式)......

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

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

    简单工厂模式 工厂方法模式 抽象工厂模式 面向对象设计的基本原则: OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭。 DIP(依赖倒转原则,Dependence Inversion Principle):...

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

    NULL 博文链接:https://quicker.iteye.com/blog/607944

    深入浅出设计模式(中文版电子版)

    3.1SimpleFactoryPattern(简单工厂模式) 24 3.1.1定义 24 3.1.2现实例子——国旗生产厂 26 3.1.3C#实例1——电子付款系统 26 3.1.4C#实例2——学校登录系统 29 3.1.5Java实例——手机简单工厂 32 3.1.6优势...

    深入浅出设计模式(中文版)

    3.1SimpleFactoryPattern(简单工厂模式) 24 3.1.1定义 24 3.1.2现实例子——国旗生产厂 26 3.1.3C#实例1——电子付款系统 26 3.1.4C#实例2——学校登录系统 29 3.1.5Java实例——手机简单工厂 32 3.1.6优势...

    Java设计模式:工厂模式——图文+代码示例(通俗易懂)

    先来看看,简单工厂模式——也叫静态工厂模式,这里举个例子:你要去买一台手机,你不用关心手机是怎么生产出来的,里面的零件具体又是怎么制造的,这些通通都交给工厂去处理,你尽管去买手机就好了。 简单工厂模式...

    SETema5:软件设计模式——抽象工厂

    SETema5 软件设计模式——抽象工厂

    设计模式(二) ——工厂模式 (3种工厂模式的实现及优缺点)

    工厂模式(Factory Pattern) 是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个...

    design-pattern-java.pdf

    六个创建型模式 六个创建型模式 简单工厂模式-Simple Factory Pattern 工厂三兄弟之简单工厂模式(一) 工厂三兄弟之简单工厂模式(二) 工厂三兄弟之简单工厂模式(三) 工厂三兄弟之简单工厂模式(四) 工厂方法...

    java和设计模式ppt教程

    java和设计模式ppt包含工厂模式、建造模式、原始模型模式、单例模式、结构模式、适配器、桥梁模式、合成模式、装饰模式、门面模式、享元模式、代理模式、行为模式、解释器模式、迭代子模式、调停者模式、备忘录模式...

    工厂模式实现数据库的增删改查

    利用JAVA设计模式——工厂模式实现对MYSQL数据库的增删改查

Global site tag (gtag.js) - Google Analytics