什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式;每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案;当我们碰到模式所描述的问题,就可以直接用相应的解决方法去解决这个问题,这就是设计模式。
设计模式就是抽象出来的东西,它不是学出来的,是用出来的;或许你根本不知道任何模式,不考虑任何模式,却写着最优秀的代码,即使以“模式专家”的角度来看,都是最佳的设计,不得不说是“最佳的模式实践”,这是因为你积累了很多的实践经验,知道“在什么场合代码应该怎么写”,这本身就是设计模式。
有人说:“水平没到,学也白学,水平到了,无师自通”。诚然,模式背熟,依然可能写不出好代码,更别说设计出好框架;OOP理解及实践经验到达一定水平,同时也意味着总结了很多好的设计经验,但"无师自通",却也未必尽然,或者可以说,恰恰是在水平和经验的基础上,到了该系统的学习一下“模式”的时候了,学习一下专家总结的结果,印证一下自己的不足,对于提高水平还是很有帮助的。
本系列的设计模式学习笔记,实际是对于《Java与模式》这本书的学习记录。
(1)简单工厂(Simple Factory)模式:又称静态工厂方法(Static Factory Method)模式。
(2)工厂方法(Factory Method)模式:又称多态性工厂(Polymorphic Factory)模式,或者虚拟构造(Virtual Constructor)模式。和简单工厂模式相比,最大的区别是工厂的多态化。
(3)抽象工厂(Abstract Factory)模式:又称工具箱(Kit或Toolkit)模式。我个人理解为生产工厂的工厂。
简单工厂模式是类的创建模式,又叫做静态工厂方法(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(); } }
优点:允许客户端相对独立于产品创建的过程,并且在系统引入新产品的时候无需修改客户端,也就是说,它在某种程度上支持“开-闭”原则。
缺点:对"开-闭"原则的支持不够,因为如果有新的产品加入到系统中去,就需要修改工厂类,将必要的逻辑加入到工厂类中。
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); } } }
工厂方法模式是类的创建模式,又叫做虚拟构造(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容器类中应用:
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) { } } }
定义
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。
起源
抽象工厂模式的起源或者说最早的应用,是用于创建分属于不同操作系统的视窗构件。
更多了解
抽象工厂,是工厂的工厂,可以配备一个静态方法,按照参数,返回所对应的具体工厂的实例(抽象工厂类型)。
关于抽象工厂,在编码中,还没碰到过实际应用的场景,暂时理解为主,不做深入学习。
设计模式学习笔记--工厂(Factory)模式,布布扣,bubuko.com
原文:http://blog.csdn.net/puma_dong/article/details/22648143