国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php框架 > 框架设计 > 设计模式:工厂方法模式

设计模式:工厂方法模式

来源:程序员人生   发布时间:2015-01-16 08:18:37 阅读次数:2877次

原文地址:http://leihuang.org/2014/12/03/factory-method/

Creational 模式

物件的产生需要消耗系统资源,所以如何有效力的产生、管理 与操作物件,1直都是值得讨论的课题, Creational 模式即与物件的建立相干,在这个分类下的模式给出了1些指点原则及设计的方向。下面罗列到的全属于Creational 模式

  • Simple Factory 模式
  • Abstract Factory 模式
  • Builder 模式
  • Factory Method 模式
  • Prototype 模式
  • Singleton 模式
  • Registry of Singleton 模式

基本概念

当1个类没法预感要创建哪一种类的对象或是1个类需要由子类来指定创建的对象时我们就需要用到Factory Method 模式了.简单说来,Factory Method可以根据不同的条件产生不同的实例,固然这些不同的实例通常是属于相同的类型,具有共同的父类.Factory Method把创建这些实例的具体进程封装起来了,简化了客户真个利用,也改良了程序的扩大性,使得将来可以做最小的改动就能够加入新的待创建的类. 通常我们将Factory Method作为1种标准的创建对象的方法,当发现需要更多的灵活性的时候,就开始斟酌向其它创建型模式转化

factory method 模式结构

img

  1. Product: 需要创建的产品的抽象类.
  2. ConcreteProduct: Product的子类,1系列具体的产品.
  3. Creator: 抽象创建器接口,声明返回Product类型对象的Factory Method.
  4. ConcreteCreator: 具体的创建器,重写Creator中的Factory Method,返回ConcreteProduct类型的实例.

代码实现

看了这么多,还不如直接写代码,来得好.

为了于简单工厂和抽象工厂做辨别,我们也取福克斯电影公司的例子.

首先定义1个Movie抽象类,然后继承两个具体电影的子类,动作片(ActionMovie),爱情片(LoveMovie). 然后有1个抽象的工厂(FoxFilmFactory),它有两个子类,1个生产工夫片(ActionFoxFactory),1个生产爱情片(LoveFoxFactory).然后我们观众(AudienceClient),只管问抽象工厂提供影片,不需要去管它具体怎样分类的.

下面是类结构图.

img

Movie 抽象类 --电影统称

package org.leihuang.factorymethod; public abstract class Movie { public abstract void play() ; }

ActionMovie 抽象类的子类 --动作片

package org.leihuang.factorymethod; public class ActionMovie extends Movie { @Override public void play() { System.out.println("哼哼哈兮!"); } }

LoveMovie 继承Movie --爱情片

package org.leihuang.factorymethod; public class LoveMovie extends Movie { @Override public void play() { System.out.println("爱老虎油!"); } }

FoxFilmFactory 抽象类 --福克斯总公司

package org.leihuang.factorymethod; public abstract class FoxFilmFactory { public abstract Movie createMovie(String name) ; }

ActionFoxFactory 继承FoxFilmFactory类 --生产动作片的部门

package org.leihuang.factorymethod; public class ActionFoxFactory extends FoxFilmFactory { @Override public Movie createMovie(String name) { Movie movie = null ; try { movie = (Movie)Class.forName(name).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return movie ; } }

LoveFoxFactory 继承抽象类 --生产爱情片的部门

package org.leihuang.factorymethod; public class LoveFoxFactory extends FoxFilmFactory { @Override public Movie createMovie(String name) { Movie movie = null ; try { movie = (Movie)Class.forName(name).newInstance() ; } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return movie; } }

AudienceClient --观众

package org.leihuang.factorymethod; public class AudienceClient { public static void main(String[] args) { FoxFilmFactory foxAction = new ActionFoxFactory() ; foxAction.createMovie("org.leihuang.factorymethod.ActionMovie").play(); ; FoxFilmFactory foxLove = new LoveFoxFactory() ; foxLove.createMovie("org.leihuang.factorymethod.LoveMovie").play(); } }


2014⑴2-03 23:55:17

Brave,Happy,Thanksgiving !


生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生