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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/puma_dong/article/details/22648143


写在模式学习之前


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

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

       有人说:“水平没到,学也白学,水平到了,无师自通”。诚然,模式背熟,依然可能写不出好代码,更别说设计出好框架;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)一共有七种,分别是:简单工厂模式、工厂方法模式、抽象工厂模式、建造模式、原型模式、单例模式、多例模式。

大致描述如下:


展开阅读全文

没有更多推荐了,返回首页