首页 > 其他 > 详细

静态工厂模式

时间:2015-03-24 09:18:26      阅读:186      评论:0      收藏:0      [点我收藏+]

主要是学习Mars的Java4Android 接口的应用这集视频做的笔记

引例:

接口是面向对象的核心,

例子是有一个Printer的接口(定义一种标准,有开机、关机和打印),然后HPPrinter类、CanonPrinter类去实现这个接口

1、Printer.java

interface Printer{
	public void open();
	
	public void close();
	
	public void print(String s);
	
}
2、HPPrinter.java

class HPPrinter implements Printer{
	public void open(){
		System.out.println("HP open");
	}
	public void close(){
		System.out.println("HP close");
	}
	public void print(String s){
		System.out.println("HP print---" + s);
	}	
}
3、CanonPrinter.java

class CanonPrinter implements Printer{<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>private void clean(){
<span style="white-space:pre">		</span>System.out.println("clean");
<span style="white-space:pre">	</span>}<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>public void close(){
<span style="white-space:pre">		</span>this.clean();
<span style="white-space:pre">		</span>System.out.println("Canon close");<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>public void open(){
<span style="white-space:pre">		</span>System.out.println("Canon open");
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>public void print(String s){
<span style="white-space:pre">		</span>System.out.println("Canon print--->" + s);
<span style="white-space:pre">	</span>}
}
4、Test.java
class Test{
public static void main(String args []){

	Printer printer = null;
	int flag == 1;
	if(flag == 0){
		printer = new HPPrinter();
	}
	if(flag == 1){
		printer = new CannonPrinter();
	}
	printer.open();
	printer.print("test");
	printer.close();
}
}
问题:

如果只是定义了一个抽象产品类角色(Printer工厂模式具体讲解)和具体产品类角色(HPPrinter、CanonPrinter),

那么测试用例(Test.java)就需要不断的new 具体打印机,(如果写另外一个测试用例,还是在new 具体打印机)

这时是重复写代码。


解决方法:静态工厂模式(又称简单工厂模式)


面向对象的终极目标之一就是减少重复代码。

把重复代码放在一个地方,当需要这些代码所提供的功能时,不是重复写一遍代码,而是调用这些功能。

加入入一个工厂类角色,把new 具体打印机的功能放在这个类中:

(设计静态工厂模式的思路就是:生成对象的代码(即使用new调用构造函数的代码)封装在工厂类当中)

PrinterFactory.java

class PrinterFactory{
	public static Printer getPrinter(int flag){
	//静态函数  向上转型
	
		Printer printer = null;
		if(flag == 0){
			printer = new HPPrinter();
		}
		else if (flag == 1) {
			printer = new CanonPrinter();
		}
		return printer;
	}
}
此时测试用例可以改写成调用PrinterFactory的getPrinter方法:

Test.java

class Test{
	public static void main(String args []){
		int flag = 1;	
		Printer printer = PrinterFactory.getPrinter(flag);
		printer.open();
		printer.print("test");
		printer.close();
	}
}
在这个例子中使用静态工厂模式好处是:

使用者不需要new 打印机,只需调用即可,不需要知道子类,而开发者也方便修改

(工厂类负责所有产品对象的创建,客户端在需要创建对象时,告诉工厂需要哪种类型,工厂就负责创建。)

设计模式结构图:

技术分享

本文例子的结构图:

技术分享



深入理解工厂模式:

静态工厂模式再往复杂方向变化是

工厂模式(过一个抽象工厂类角色)

参考点击打开链接

抽象工厂模式

参考点击打开链接





静态工厂模式

原文:http://blog.csdn.net/zhanhong39/article/details/44573241

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!