设计模式:工厂方法模式
来源:程序员人生 发布时间:2015-01-16 08:18:37 阅读次数:3167次
原文地址: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 模式结构
- Product: 需要创建的产品的抽象类.
- ConcreteProduct: Product的子类,1系列具体的产品.
- Creator: 抽象创建器接口,声明返回Product类型对象的Factory Method.
- ConcreteCreator: 具体的创建器,重写Creator中的Factory Method,返回ConcreteProduct类型的实例.
代码实现
看了这么多,还不如直接写代码,来得好.
为了于简单工厂和抽象工厂做辨别,我们也取福克斯电影公司的例子.
首先定义1个Movie抽象类,然后继承两个具体电影的子类,动作片(ActionMovie),爱情片(LoveMovie). 然后有1个抽象的工厂(FoxFilmFactory),它有两个子类,1个生产工夫片(ActionFoxFactory),1个生产爱情片(LoveFoxFactory).然后我们观众(AudienceClient),只管问抽象工厂提供影片,不需要去管它具体怎样分类的.
下面是类结构图.
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 !
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠