设计模式之(三)---工厂方法模式

女娲补天的故事大家都听过吧,这个故事是说,女娲在补了天后,下到凡间一看,哇塞,风景太优美了,天空是湛

蓝的,水是清澈的,空气是清新的,太美丽了,然后就待时间长了就有点寂寞了,没有动物,这些看的到

都是静态的东西呀,怎么办?

别忘了是神仙呀,没有办不到的事情,于是女娲就架起了八卦炉(技术术语:建立工厂)开始创建人,

具体过程是这样的:先是泥巴捏,然后放八卦炉里烤,再扔到地上成长,但是意外总是会产生的:

第一次烤泥人,兹兹兹兹~~,感觉应该熟了,往地上一扔,biu~,一个白人诞生了,没烤熟!

第二次烤泥人,兹兹兹兹兹兹兹兹~~,上次都没烤熟,这次多烤会儿,往地上一扔,嘿,熟过头了,

黑人哪!

第三次烤泥人,兹~兹~兹~,一边烤一边看着,嘿,正正好,Perfect!优品,黄色人类! 【备注:RB 人

不属此列】

那这个过程我们就用程序来表现,首先定义一个人类的总称:

package com.fc.factory;
/**
 * 人类
 * @author fc
 *
 */
public interface Human {
 public  void laugh();
 public  void talk();

}

然后定义具体的人,黄种人,白人,黑人:

package com.fc.factory;

public class YellowHuman implements Human {
	public void laugh() {
		System.out.println("黄种人在笑,哈哈哈");

	}

	public void talk() {

		System.out.println("黄种人在讲话");
	}

}
package com.fc.factory;

public class WhiteHuman implements Human {
	public void laugh() {
		System.out.println("白人在笑,哈哈哈");

	}

	public void talk() {

		System.out.println("白人在讲话");
	}

}
package com.fc.factory;

public class BlackHuman implements Human {
	public void laugh() {
		System.out.println("黑人在笑,哈哈哈");

	}

	public void talk() {

		System.out.println("黑人在讲话");
	}

}

人类也定义完毕了,那我们把八卦炉(用于生产人)定义出来:

package com.fc.factory;

public class HumanFactory {

 public static  Human createHuman(Class c){
	 Human human=null;
	 try {
		human=(Human)Class.forName(c.getName()).newInstance();
	} catch (InstantiationException e) {
		//  //你要是不说个人类颜色的话,没法烤,要白的还是黑的,你说了才好烤
		System. out.println(" 必须指定人类的颜色");
		e.printStackTrace();
	} catch (IllegalAccessException e) {
		//定义的人类有问题,那就烤不出来了
		System. out.println(" 人类定义错误! ");
		e.printStackTrace();
	} catch (ClassNotFoundException e) {
		//你随便说个人类,我到哪里给你制造去?!
		 System. out.println(" 混蛋,你指定的人类找不到! ");
		e.printStackTrace();
	}
	return human;

}

}

然后女娲来了,这可是真正的女神啊:

package com.fc.factory;

public class NvWa {

	/**
	 * @param args
	 * @author fc
	 */
	public static void main(String[] args) {
		// 女娲第一次造人,试验性质,少造点,火候不足,缺陷产品
		System.out.println("------------造出的第一批人是这样的:白人-----------------");

		Human whiteHuman = HumanFactory.createHuman(WhiteHuman.class);

		whiteHuman.laugh();
		whiteHuman.talk();
		// 女娲第二次造人,火候加足点,然后又出了个次品,黑人
		System.out.println("\n\n------------造出的第二批人是这样的:黑人-----------------");

		Human blackHuman = HumanFactory.createHuman(BlackHuman.class);

		blackHuman.laugh();
		blackHuman.talk();
		// 第三批人了,这次火候掌握的正好,黄色人类,备注: RB人不属 于此列

		System.out.println("\n\n------------造出的第三批人是这样的:黄色人类 -----------------");

		Human yellowHuman = HumanFactory.createHuman(YellowHuman.class);

		yellowHuman.laugh();
		yellowHuman.talk();
	}

}

好了我们再来看一下输出结果:

------------造出的第一批人是这样的:白人-----------------
白人在笑,哈哈哈
白人在讲话

------------造出的第二批人是这样的:黑人-----------------
黑人在笑,哈哈哈
黑人在讲话

------------造出的第三批人是这样的:黄色人类 -----------------
黄种人在笑,哈哈哈
黄种人在讲话
时间: 2024-10-28 23:43:49

设计模式之(三)---工厂方法模式的相关文章

23种设计模式[2]:工厂方法模式

一.简单工厂模式(静态工厂方法,不属于23种GOF设计模式之一) 定义:定义一个用于创建产品对象的方法,由该工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例. 类型:创建类模式 public interface SmsService { void sendSms(); } public class MontnetsService implements SmsService { @Override public void sendSms() { Syste

大话设计模式-第八章-工厂方法模式

一.UML图 二.包含的角色 (1)抽象工厂 (2)具体工厂 (3)抽象产品 (4)具体产品 三.优势 (1)工厂方法模式是对简单工厂模式的稍微的改进.工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际工作推迟到子类中. (2)与简单工厂模式相比,制造产品的工厂类不再 只有一个,而是每种具体产品类都对应一个生产它的具体工厂类.而这些具体工厂类的共同特征再被提取出来形成一个抽象产品类,这些具体产品类都继承自这个抽象产品类. (3)当需要增加一种产品的时候,需要做的是:增加一种继承自抽象产品

设计模式2:工厂方法模式

定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 类型:创建类模式 类图: 工厂方法模式代码 [java] view plaincopy interface IProduct { public void productMethod(); } class Product implements IProduct { public void productMethod() { System.out.println("产品"); } } int

大话设计模式C++版——工厂方法模式

工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览<大话设计模式C++版--简单工厂模式>.在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发-封闭原则,其主要原因是由于switch的判断结构的使用,使修改或添加新的对象时需要改动简单工厂类的代码,不符合开放-封闭原则,那么工厂方法模式会在那方面有所改进呢?我们仍以简单工厂模式中加减法计算器为例. 1.保持简单工厂模式的 IOperation 接口和实现对象(COperation_Add 和 COperation_

设计模式学习笔记--工厂方法模式

学习过简单工厂模式,感觉很好用.在创建对象时,可以将复杂的初始化操作从客户端分离出来,简化客户端代码.大大的减少了代码修改的难度.而且可以通过参数不同,创建不同的对象. 但是简单工厂模式也有一些弊端,违背了开放--封闭原则.即如果我们增加了一个产品,对应的工厂也要进行修改,即switch---case中要新增加一些分支条件,不利于扩展.所以就有了下面的工厂方法模式: 工厂方法模式:定义了一个用于创建对象的接口,子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到子类. // 设计模式Dem

设计模式C++实现——工厂方法模式

模式定义: 工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类. 模式结构: Creator是一个类,它实现了全部操纵产品的方法,但不实现工厂方法. Creator的全部子类都必须实现工厂方法(factoryMethod()),以实际制造出产品. 全部的产品必须实现Product基类.这样一来使用这些产品的类就能够引用这个基类,而不是派生类. 举例: 披萨店希望可以开一些加盟店. 经营者希望确保加盟店运营的质量,所以希望这些店都使用能经过实践

设计模式(五)_工厂方法模式

今天主要讲解的是工厂方法模式.内容参考自java_my_life 博主的博客.但是拒绝粘贴复制,全部手打 工厂方法模式是类的创建模式.工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作,推迟到子类中. 案例说明 大家很多时候都做过导出功能,比如一个系统,需要导出的格式包括html.pdf等.但是财务系统导出的格式和其他普通的格式又不一样, 此时如果用我们上篇学到的简单工厂模式,势必会让工厂类很繁琐,各种if判断.日后增加导出的格式,又会对工厂类进行增加逻辑编写. 此时我们采用 工

设计模式之:工厂方法模式

模式的定义与特点 工厂方法(FactoryMethod)模式的定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的“创建与使用相分离”的特点. 我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”.如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背“开闭原则”. 本节介绍的“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以

设计模式5:工厂方法模式

在之前提到的简单方法模式中,如果需要给计算器添加一种运算,需要增加一个Operation子类,然后修改工厂类. 这样的设计一方面简化了客户端的修改,另一方面需要修改工厂类,这是违反开放-封闭模式的. 处理这种问题的另一种方法是工厂方法模式. 工厂方法模式克服了违反开放-封闭的缺点,同时保持了封装对象创建过程的优点,但是带来的缺点是,需要新增一个工厂类+修改客户端代码以实现功能扩展. 来看UML图: 四种运算的子类是继承了Operation基类,每个子类都有一个对应的工厂类,封装了创建其实例的过程

设计模式学习(一)——工厂方法模式

这里抄一段维基百科的定义,工厂方法模式即:定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类.工厂方法让类的实例化推迟到子类中进行. 下图展示了一个工厂方法模式的结构图: 在上图中,展示了一个工厂方法模式的使用过程,消费者(类的使用者)要购买一个运动产品,他需要到该产品的生产厂家那里购买,生产厂家实现“运动产品”的生产.在这个过程中,消费者只需要特定功能的产品,而不管功能是如何实现的.工厂只需要生产指定产品,而不管产品是如何设计的.而产品类只需要提供产品功能的设计. 这与iphone