MyException - 我的异常网
当前位置:我的异常网» 设计模式 » 设计模式学习笔记-工场(Factory)、建造(Builder)和

设计模式学习笔记-工场(Factory)、建造(Builder)和原型(Prototype)

www.MyException.Cn  网友分享于:2014-04-02  浏览:0次
设计模式学习笔记--工厂(Factory)、建造(Builder)和原型(Prototype)


写在模式学习之前


       什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式;每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案;当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式。

       设计模式就是抽象出来的东西,它不是学出来的,是用出来的;或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以“模式专家”的角度来看,都是最佳的设计,不得不说是“最佳的模式实践”,这是因为你积累了很多的实践经验,知道“在什么场合代码应该怎么写”,这本身就是设计模式。

       有人说:“水平没到,学也白学,水平到了,无师自通”。诚然,模式背熟,依然可能写不出好代码,更别说设计出好框架;OOP理解及实践经验到达一定水平,同时也意味着总结了很多好的设计经验,但"无师自通",却也未必尽然,或者可以说,恰恰是在水平和经验的基础上,到了该系统的学习一下“模式”的时候了,学习一下专家总结的结果,印证一下自己的不足,对于提高水平还是很有帮助的。

       本系列的设计模式学习笔记,实际是对于《Java与模式》这本书的学习记录。


工厂模式的几种形态


工厂模式专门负责将大量有共同接口的类实例化。工厂模式有以下几种形态:

(1)简单工厂(Simple Factory)模式:又称静态工厂方法(Static Factory Method)模式。

(2)工厂方法(Factory Method)模式:又称多态性工厂(Polymorphic Factory)模式,或者虚拟构造(Virtual  Constructor)模式。和简单工厂模式相比,最大的区别是工厂的多态化。

(3)抽象工厂(Abstract Factory)模式:又称工具箱(Kit或Toolkit)模式。我个人理解为生产工厂的工厂。


简单工厂(Simple Factory)模式


定义


简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂类决定创建出哪一种产品类的实例。


结构图




模式所涉及的角色


(1)工厂类(Creator)角色:担任这个角色的是简单工厂模式的核心,含有与应用紧密相连的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体Java类实现。

(2)抽象产品(Product)角色:担任这个角色的类是由简单工厂模式所创建的对象的父类,或它们共同拥有的接口。抽象产品角色可以用一个Java接口或者Java抽象类实现。

(3)具体产品(Concrete Product)角色:简单工厂模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体Java类实现。

注意:抽象产品角色可以省略、工厂角色与抽象产品角色可以合并、三个角色也可以全部合并、可以通过登记式的工厂方法达到产品对象的循环使用(例如单例的实现)。


代码演示

interface Product {}
class ConcreteProduct implements Product
{
	public ConcreteProduct();
}
class Creator
{
	//静态工厂方法
	public static Product factory()
	{
		return new ConcreteProduct();
	}
}

优缺点


优点:允许客户端相对独立于产品创建的过程,并且在系统引入新产品的时候无需修改客户端,也就是说,它在某种程度上支持“开-闭”原则。

缺点:对"开-闭"原则的支持不够,因为如果有新的产品加入到系统中去,就需要修改工厂类,将必要的逻辑加入到工厂类中。


简单工厂在Java中的应用

import java.util.*;
import java.text.*;
class DateTest
{
	public static void main(String[] args)
	{
		Locale local = Locale.FRENCH;
		Date date = new Date();
		String now = DateFormat.getTimeInstance(DateFormat.DEFAULT,local).format(date);
		System.out.println(now);
		try
		{
			date = DateFormat.getDateInstance(DateFormat.DEFAULT,local).parse("16 nov. 01");
			System.out.println(date);
		}
		catch (ParseException e)
		{
			System.out.println("Parsing exception:" + e);
		}
	}
}

DateFormat是个抽象类,在这个“简单工厂模式”例子中,它是工厂类角色和抽象产品角色的合体,完成具体产品角色的创建。


工厂方法(Factory Method)模式


定义


工厂方法模式是类的创建模式,又叫做虚拟构造(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。

工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。

工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,保持了简单工厂的优点,客服了其缺点,允许系统在不修改具体工厂角色的情况下引进新的产品(实际是增加新的具体工厂角色)。


结构图




模式所涉及的角色


(1)抽象工厂(Creator)角色:担任这个角色的是工厂方法模式的核心,它是与应用程序无关的。任何在模式中创建对象的工厂类必须实现这个接口。这个角色可以由Java接口或者抽象类实现。

(2)具体工厂(Concrete Creator)角色:担任这个角色的是实现了抽象工厂接口的具体Java类。具体工厂角色含有与应用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。

(3)抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。这个角色可以由Java接口或者抽象类实现。

(4)具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所声明的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。

注意:一个工厂方法模式的实现依赖于工厂角色和产品角色的多态性,在有些情况下,这个模式可以出现退化,其特征就是多态性的丧失。可以退化的很像简单工厂模式,经常被简单工厂模式代替;也可以退化的根本就不是工厂方法模式了,注意识别。


代码演示

interface Product
{
}
class ConcreteProduct1 implements Product
{
	public ConcreteProduct1() {}
}
class ConcreteProduct2 implements Product
{
	public ConcreteProduct2() {}
}
interface Creator
{
	//工厂方法
	public Product factory();
}
class ConcreteCreator1 implements Creator
{
	public Product factory()
	{
		return new ConcreteProduct1();
	}
}
class ConcreteCreator2 implements Creator
{
	public Product factory()
	{
		return new ConcreteProduct2();
	}
}
class Client
{
	private static Creator c1,c2;
	private static Product p1,p2;
	public static void main(String[] args)
	{
		c1 = new ConcreteCreator1();
		p1 = c1.factory();
		c2 = new ConcreteCreator2();
		p2 = c2.factory();
	}
}

工厂方法在Java中的应用


在Java容器类中应用:

Collection接口有方法iterator(),返回Iterator接口,每个实现类实现了这个iterator()方法,用于创建一个Iterator类型的对象。

URL与URLConnection的应用:

import java.net.*;
import java.io.*;

class URLConnectionReader
{
	public static void main(String[] args)
	{		
		try
		{
			URL b = new URL("http://www.baidu.com");
			URLConnection c = b.openConnection();
			BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
			String s;
			while((s = in.readLine())!=null)
			{
				System.out.println(s);
			}
			in.close();
		}
		catch (Exception e)
		{
		}		
	}
}

抽象工厂(Abstract Factory)模式


定义

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。

起源

抽象工厂模式的起源或者说最早的应用,是用于创建分属于不同操作系统的视窗构件。

更多了解

抽象工厂,是工厂的工厂,可以配备一个静态方法,按照参数,返回所对应的具体工厂的实例(抽象工厂类型)。


建造(Builder)模式


定义

建造模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象

结构图


更多了解

(1)建造模式和抽象工厂模式非常相像,两者有都是用来创建同时属于几个产品族的对象的模式。

(2)在抽象工厂模式中,每一次工厂对象被调用时都会返还一个完整的产品对象,而客户端有可能会决定把这些产品组装成一个更大更复杂的产品,也有可能不会;建造模式则不同,它一点一点地建造出一个复杂的产品,而这个产品的组装过程就发生在建造者角色的内部。换言之,抽象工厂模式处在更加具体的制度上,而建造模式则处于更加宏观的制度上。


原型(Prototype)模式


定义

通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的办法创造出更多同类型的对象,这就是原型模式的用意。

结构图--简单形式的原始模式


结构图--登记形式的原始模式


更多了解

关于原型模式,只需要深刻了解Java语言中的克隆机制,深层次克隆,浅层次克隆就可以了。实际上这种模型,就是对我们日常工作中使用克隆这种行为的总结。


创建模式(Creational Pattern)小结


创建模式(Creational Pattern)一共有七种,分布是:简单工厂模式、工厂方法模式、抽象工厂模式、建造模式、原型模式、单例模式、多例模式。


本篇介绍了其中的5种:简单工厂、工厂方法、抽象工厂、建造者、原型。

文章评论

看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
编程语言是女人
编程语言是女人
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
我是如何打败拖延症的
我是如何打败拖延症的
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
那些争议最大的编程观点
那些争议最大的编程观点
程序员的鄙视链
程序员的鄙视链
我的丈夫是个程序员
我的丈夫是个程序员
一个程序员的时间管理
一个程序员的时间管理
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
Java程序员必看电影
Java程序员必看电影
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
如何成为一名黑客
如何成为一名黑客
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序员和编码员之间的区别
程序员和编码员之间的区别
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
旅行,写作,编程
旅行,写作,编程
为什么程序员都是夜猫子
为什么程序员都是夜猫子
 程序员的样子
程序员的样子
程序员必看的十大电影
程序员必看的十大电影
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员都该阅读的书
程序员都该阅读的书
代码女神横空出世
代码女神横空出世
中美印日四国程序员比较
中美印日四国程序员比较
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
鲜为人知的编程真相
鲜为人知的编程真相
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
每天工作4小时的程序员
每天工作4小时的程序员
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
程序员应该关注的一些事儿
程序员应该关注的一些事儿
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
老程序员的下场
老程序员的下场
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
10个调试和排错的小建议
10个调试和排错的小建议
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有