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

2014-11-24 00:07:41 · 作者: · 浏览: 0


写在模式学习之前


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

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

有人说:“水平没到,学也白学,水平到了,无师自通”。诚然,模式背熟,依然可能写不出好代码,更别说设计出好框架;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)模式。

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

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


结构图


vcv5yea8sLXEvcfJqzwvaDI+CjxwPjxicj4KPC9wPgo8cD6jqDGjqbPpz/O5pLOno6hDcmVhdG9yo6m9x8mro7q1o8jO1eK49r3Hyau1xMrHuaSzp7e9t6jEo8q9tcS6y9DEo6zL/MrH0+vTptPDs8zQ8s7eudi1xKGjyM66ztTaxKPKvdbQtLS9qLbUz/O1xLmks6fA4LHY0OvKtc/W1eK49r3Tv9qho9XiuPa9x8mrv8nS1NPJSmF2Yb3Tv9q78tXfs+nP88DgyrXP1qGjPGJyPgo8L3A+CjxwPqOoMqOpvt/M5bmks6ejqENvbmNyZXRlIENyZWF0b3Kjqb3HyaujurWjyM7V4rj2vcfJq7XEysfKtc/Wwcuz6c/zuaSzp73Tv9q1xL7fzOVKYXZhwOCho77fzOW5pLOnvcfJq7qs09DT69Om08PD3MfQz+C52LXEwt+8raOssqLH0srctb3TptPDs8zQ8rXEtffTw9LUtLS9qLL6xre21M/zoaM8YnI+CjwvcD4KPHA+o6gzo6mz6c/zsvrGt6OoUHJvZHVjdKOpvcfJq6O6uaSzp7e9t6jEo8q9y/m0tL2otcS21M/ztcSzrMDg0M2jrNKyvs3Kx7L6xre21M/ztcS5ss2suLjA4LvyubLNrNO109C1xL3Tv9qho9XiuPa9x8mrv8nS1NPJ