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

学习设计模式系列之——工厂方法模式(Java)

阅读更多

是初学者,请各位前辈指点。谢谢。

 

工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 。工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

现有如下例子说明:Apple类和Banana类分别实现了Fruit接口,FruitFactory类负责创建Apple实例和Banana实例,MainClass是程序的入口,负责测试,代码如下:

/** 
 * 苹果类
 * 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("采集香蕉");
	}
}

/** 
 * 水果工厂类
 * 2010-6-26 下午09:53:48
 */
public class FruitFactory {	
	/**
	 * get方法,获得所有产品对象
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 * @throws ClassNotFoundException 
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 */
	public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException{
		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: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();
		}
		
	}

}

 现要增加一个犁子类:Pear,同样实现Fruit接口,代码如下:

/** 
 * 犁子类
 * 2010-6-27 下午08:28:53
 */
public class Pear implements Fruit {

	/* (non-Javadoc)
	 * @see Fruit#get()
	 */
	@Override
	public void get() {
		System.out.println("采集梨子");
	}

}

 那么这时就要将FruitFactory类进行修改,增加一个else if 的判断语句,修改后的代码如下:

/** 
 * 水果工厂类
 * 2010-6-26 下午09:53:48
 */
public class FruitFactory {
	/**
	 * get方法,获得所有产品对象
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 * @throws ClassNotFoundException 
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 */
	public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException{
		if(type.equalsIgnoreCase("apple")){
			return Apple.class.newInstance();
		}else if(type.equalsIgnoreCase("banana")){
			return Banana.class.newInstance();
		}else if(type.equalsIgnoreCase("pear")){
			return Pear.class.newInstance();
		}else{
			System.out.println("can not find class");
			return null;
		}
	}
}

 

这样修改虽然说可以,但是违反了“开闭原则”,对扩展开放,对修改关闭。

第二步,我们做以下修改,Apple类和Banana类保持不变,将原来的水果工厂类(FruitFactory),改成接口,代码如下:

/** 
 * 水果工厂接口
 * 2010-6-26 下午09:53:48
 */
public interface FruitFactory {
	public Fruit getFruit();
}

 同时我们增加两个工厂类:AppleFactory,BananaFactory,这两个类分别实现FruitFactory这个接口,代码如下:

/** 
 * 苹果工厂类
 * 2010-6-27 下午08:52:52
 */
public class AppleFacotry implements FruitFactory {

	/* (non-Javadoc)
	 * @see FruitFactory#getFruit()
	 */
	@Override
	public Fruit getFruit() {
		return new Apple();
	}

}

/** 
 * 香蕉工厂类
 * 2010-6-27 下午08:55:08
 */
public class BananaFactory implements FruitFactory {

	/* (non-Javadoc)
	 * @see FruitFactory#getFruit()
	 */
	@Override
	public Fruit getFruit() {
		return new Banana();
	}

}

 

这时,我们来修改MainClaa,代码如下:

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

		//获得AppleFactory
		FruitFactory appleFactory=new AppleFacotry();
		//通过AppleFactory获得Apple
		Fruit apple=appleFactory.getFruit();
		apple.get();
		
		//获得BananaFactory
		FruitFactory bananaFactory=new BananaFactory();
		Fruit banana=bananaFactory.getFruit();
		banana.get();
	}
}

 这时,当我们增加一个新的水果“犁子”时,我们就不需要修改原来的代码,只需要增加一个Pear类,代码和上面的代码一样,和增加一个PearFactory类即可,代码如下:

/** 
 * 犁子工厂类
 * 2010-6-27 下午09:09:01
 */
public class PearFactory implements FruitFactory {

	/* (non-Javadoc)
	 * @see FruitFactory#getFruit()
	 */
	@Override
	public Fruit getFruit() {

		return new Pear();
	}

}

//主程序如下:

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

		//获得AppleFactory
		FruitFactory appleFactory=new AppleFacotry();
		//通过AppleFactory获得Apple
		Fruit apple=appleFactory.getFruit();
		apple.get();
		
		//获得BananaFactory
		FruitFactory bananaFactory=new BananaFactory();
		Fruit banana=bananaFactory.getFruit();
		banana.get();
		
		//获得PearFactory
		FruitFactory pearFactory=new PearFactory();
		Fruit pear=pearFactory.getFruit();
		pear.get();
	}
}

各个角色和职责 

1.抽象工厂(Creator)角色:工厂方法模式的核心,任何工厂类都必须实现这个接口,如FruitFactory。

2.具体工厂( Concrete  Creator)角色:具体工厂类是抽象工厂的一个实现,负责实例化产品对象,如AppleFactory。

3.抽象(Product)角色:工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口,如Fruit。

4.具体产品(Concrete Product)角色:工厂方法模式所创建的具体实例对象,如Apple

0
0
分享到:
评论
1 楼 mercyblitz 2010-06-28  
楼主还有一个做法,我觉得更好。


FruitFactory -> FruitBuilder ->Fruit

这样FruitFactory是抽象工厂,FruitBuilder是工厂。

相关推荐

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

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

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

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

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

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

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

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

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

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

    Java设计模式 版本2

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

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

    工厂模式: – 实现了创建者和调用者的分离。 – 详细分类: 简单工厂模式 工厂方法模式 抽象工厂模式 面向对象设计的基本原则: OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改...

    java设计模式

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

    设计模式——JAVA.docx

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

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

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

    简单工厂模式

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

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

    4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 4.5FacadePattern(外观模式) 134 4.5.1定义 134 4.5.2...

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

    4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 4.5FacadePattern(外观模式) 134 4.5.1定义 134 4.5.2...

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

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

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

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

    design-pattern-java.pdf

    基础知识 基础知识设计模式概述 从招式与内功谈起——设计模式概述(一) 从招式与内功谈起——设计模式概述(二) 从招式与内功谈起——设计模式概述(三) 面向对象设计原则 面向对象设计原则之单一职责原则 面向...

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

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

    java和设计模式ppt教程

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

    java高手真经 (UML建模+设计模式+面向服务架构) 卷6

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

Global site tag (gtag.js) - Google Analytics