众所周知设计模式在软件开发中的地位之重要, 设计模式使人们可以更加简单方便地复用成功的设计和体系结构。将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。
下面就我个人的见解来简单的说下工厂方法模式,只是个人看法,如果有不周全的地方,欢迎各位看客来指点。
工厂方法的英文定义是:Define an interface for creating an object, but let subclasses decide which class to instantiate.Factory
Method lets a class defer instantiation to subclasses.中文简单的意思是:定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
首先我们假设要制造交通工具,一种是制造公交车,一种是制造小汽车。这两种当然可以在两个工厂中制造,但是假设是一个厂家的话,为了减少成本,更好的利用设备(比如制造轮子的设备应该有部分是一样的),我们可以采用工厂方法来解决这个问题。
工厂方法模式的同通用例图如下:
在工厂方法中,抽象产品类Product负责定义产品的共性,实现对事物的最抽象定义,Creator为抽象创建类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的。由于该模式的变种很多,下面是一个比较实用的通用模式源码:
1.抽象产品类:
public abstract class Product {
public void methold1(){
}
public abstract void method();
}
具体的产品可以是多个,但都继承Product类
2.具体产品类:
public class ConcreteProduct1 extends Product {
@Override
public void method() {
// TODO Auto-generated method stub
System.out.println("-----公交车厂生产自行车----");
}
}
public class ConcreteProduct2 extends Product {
@Override
public void method() {
// TODO Auto-generated method stub
System.out.println("!!!!汽车车厂生产汽车!!!!");
}
}
抽象工厂负责定义产品对象的产生
3.抽象工厂类:
public abstract class Creator {
public abstract <T extends Product>T createProduct(Class<T> c);
//这里的T表示是继承了Product类的类作参数就可以。
//刚开始就是这个地方卡住我了,呵呵,大脑转不过来啊
}
具体如何产生一个产品的对象,是由具体工厂来实现的。
4.具体工厂类:
public class ConcreteCreator extends Creator {
@Override
public <T extends Product> T createProduct(Class<T> c) {
// TODO Auto-generated method stub
Product product=null;
try {
product=(Product) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("工厂生产错误");
}
return (T) product;
}
}
5.下面是一个测试类:
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Creator creator=new ConcreteCreator();
Product product1=creator.createProduct(ConcreteProduct1.class);
product1.method();
Product product2=creator.createProduct(ConcreteProduct2.class);
product2.method();
}
}
以上就是一个简单的工厂方法模式的具体应用,测试后会产
生如下结果:
小结:工厂方法模式具有良好的封装性,代码结构清晰,扩展性非常强。在增加产品类的情况下,只要适当的修改具体工厂或者扩展一个工厂类就可以完成变化的需求,“达到一种将变化融入不变之中”。工厂方法模式的应用范围非常广,例如设计一个邮件服务器的框架,有三种网络协议:POP3、IMPA、HTTP,我们就可以把这三种连接方法作为产品类,定义一个接口如IConnect,然后定义对邮件的操作方法,用不同的方法实现三个具体产品类再定义一个工厂方法,按照不同的传入条件,选择不同的协议。
当然工厂方法模式可以升级为更为复杂的模式,也可以缩小为简单工厂模式这都是后话了。