简单来说,工厂模式就是按照需求来返回一个类型的对象,使用工厂模式的意义就是,如果对象的实例化与代码依赖太大的话,不方便进行扩展和维护,使用工厂的目的就是使对象的实例化与主程序代码就行解耦.来具体看一下:
1. 简单工厂模式简介
简单工厂模式(simple factory),又被称为静态工厂方法模式。它属于创建模式(创建对象的模式),并且是工厂方法模式的一种特殊实现。
通常,我们利用简单工厂模式来进行类的创建。例如,获取线程池对象,就是通过简单工厂模式来实现的。它的结构图如下所示:
工厂:工厂是简单工厂模式的核心,提供了对外接口。客户端或其它程序要获取product对象,都是通过factory的接口来获取的。
抽象产品:抽象产品是(许多)不同产品抽象出来的。product可以是接口或者抽象类。
具体产品:工厂中返回的产品对象,实际上是通过concreteproduct来创建的。
2. 简单工厂模式代码模型
public class factory {
public static product newinstance() {
return new concreteproduct();
}
}
public abstract product {
}
public class concreteproduct extends product {
public concreteproduct() {}
}
3.简单工厂模式的实际应用
我们在写一个servlet处理客户端请求的时候, 往往会一个servlet处理多个业务逻辑, 比如:
protected void dopost(httpservletrequest request, httpservletresponse response) {
string flag = request.getparameter("flag");
if(flag.equals("service1")) {
service1();
}else if(flag.equals("service2")) {
service2();
}
...
}
以上是我们的servlet处理多业务逻辑的常规方法, 写一坨if else语句。一种比较好的办法就是, 将请求的分发与servlet分离, 让servlet只处理业务逻辑。我们把各种请求的servlet看做产品类, javax.servlet.httpservlet是产品父类, javax.servlet.servlet是产品接口, 这样我们定义一个servletfactory, 在过滤器里解析url请求并交给servletfactory来处理就可以了。 这就是一个典型的简单工厂应用。
@webfilter("/transrequest")
public class transrequest implements filter{
private string servletname;
@override
public void dofilter(servletrequest request, servletresponse response,
filterchain chain) throws ioexception, servletexception {
httpservletrequest myrequest = (httpservletrequest)request;
//拿到请求的servlet名字, 这里我们约定请求都是/servletname形式
string names[] = myrequest.getrequesturi().trim().split("/");
servletname = names[2];
if( servletname != null) {
//以下是最典型的两句简单工厂的例子
servlet servlet = servletfactory.createservlet(servletname);
servlet.service(request, response);
}else
chain.dofilter(request, response);
}
每次来一个请求我们用工厂生产一个servlet, 这样可以免去在xml配置大量的servlet路径信息比较方便。而且这样也会使逻辑更加清晰, servlet仅仅就是在业务层处理业务。
工厂类如下:
public class servletfactory {
public static servlet createservlet(string servletname) throws servletexception {
if(servletname.equals("servletname1")) {
return new service1();
}else if(servletname.equals("servletname2")){
return new service2();
}else{
throw new servletexception("no such servlet");
}
}
}
上面的工厂类虽然没有抛开繁琐的if else, 但是利用简单工厂的思想仍然解决了一些问题。简单工厂是非常简单的一种算不上设计模式的设计模式, 解决的问题也很有限。 以上请求分发各大javaee 框架都已实现, 例如struts2, 当然框架不是用的简单工厂。
4.总结
简单工厂模式, 总结起来就是一个工厂类,一个产品接口(其实也可以是一个抽象类,甚至一个普通的父类)和一群实现了产品接口的具体产品,而这个工厂类,根据传入的参数去创造一个具体的实现类,并向上转型为接口作为结果返回。
以上就是以java代码为例讲解设计模式中的简单工厂模式的内容。