现在的位置: 首页 > 综合 > 正文

简单工厂(Factory)模式

2013年10月28日 ⁄ 综合 ⁄ 共 1755字 ⁄ 字号 评论关闭

      举两个例子以快速明白Java中的简单工厂模式:

 女娲抟土造人
话说:“天地开辟,未有人民,女娲抟土为人。”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面。女娲造人,这就是简单工厂模式的应用。

  首先,在这个造人的思想里面,有几个重要的角色:女娲本身、抽象的人的概念和女娲所造出的一个个具体的人。
  1.女娲是一个工厂类,也就是简单工厂模式的核心角色。

        2.具休的一个个的人,包括张三,李四等。这些人便是简单工厂模式里面的具体产品角色

  3.抽象的人是最早只存在于女娲的头脑里的一个想法,女娲按照这个想法造出的一个个具体的人,便都符合这个抽象的人的定义。换言之,这个抽象的想法规定了所有具体的人必须都有的接口(抽象的想法

   其UML类图出下所示:
    
理解了上面的这些东西,再来理解下面的例子,对照理解,相信看完这篇文章,便对java简单工厂模式有一个很好的理解:

有一个农场公司,专门向市场销售各类水果,在这个系统里需要描述下列水果:
     葡萄 Grape
     草莓 Stuawberry
     苹果 Apple
水果与其他植物不同,最终可以采摘食用,那么一个自然的做法是建立一个各种水果都适用的接口,以便与其他农场里的植物区分开来,

看了上面的2个例子,我们应该对简单工厂模式有了简单了解。下面我就写一个类似例子1的小程序,体验一下这个模式

1.写一个接口(抽象的想法),代码如下所示;

package org.lxh.dao;
/**
 * @author chenwill3
 */
public interface Fruit {

	public abstract void eat();

}

2.下面写几个类(简单工厂模式里面的具体产品角色)来实现这个接口;

package org.lxh.impl;

import org.lxh.dao.Fruit;

public class Apple implements Fruit {

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

}

package org.lxh.impl;

import org.lxh.dao.Fruit;

public class Coconut implements Fruit {

	public void eat() {
		System.out.println("**我在吃椰子**");

	}

}

package org.lxh.impl;

import org.lxh.dao.Fruit;

public class Orange implements Fruit {

	public void eat() {
		System.out.println("**我在吃橘子**");

	}

}

3.写一个工厂类(女娲),代码如下所示

package org.lxh.factory;

import org.lxh.dao.Fruit;
import org.lxh.impl.Apple;
import org.lxh.impl.Coconut;
import org.lxh.impl.Orange;

public class FruitFactory {
	public static Fruit getInstance(String type) {
		Fruit f = null;
		if ("apple".equals(type)) {
			f = new Apple();
		} else if ("orange".equals(type)) {
			f = new Orange();
		} else if ("coconut".equals(type)) {
			f = new Coconut();
		}
		return f;
	}
}

4.写一个测试类查看效果。

package test;

import org.lxh.dao.Fruit;
import org.lxh.factory.FruitFactory;

public class Test {

	/**
	 * @author chenwill3
	 */
	public static void main(String[] args) {
		Fruit f=null;
        f=FruitFactory.getInstance("apple");
        
        if(f!=null)
        {
        	f.eat();
        }
	}

}

   下面看一下运行效果图;

   这次还是一样,源码也提供下载。有问题的给我写评论。

抱歉!评论已关闭.