工厂方法的使用者可能会面临两种情况:第一种情况是对于某个产品,我清楚地知道应该使用哪个具体工厂为我服务,于是,我实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况。第二种情况,我只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为我生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。
两种情况下具体的实现是不一样的,对于第一种情况,很可能是产品和生产者(工厂)各有一个公共接口,然后不同的具体工厂生产出对应不同的产品,二者出现平行的类结构。第二种情况各个具体生成者的共同父类通过静态方法的形式对外提供一个接口,返回哪个具体工厂实例的判断逻辑在该静态方法中实现,使用者通过调用该静态方法得到具体的工厂实例。
//情况一:
Factory fac = new FactoryImplA(); //指定工厂
Product pro = fac.createProduct(); // 由指定工厂生成出具体的产品
pro.use();
Factory fac = new FactoryImplA(); //指定工厂
Product pro = fac.createProduct(); // 由指定工厂生成出具体的产品
pro.use();
//情况二:
Factory fac = Factory.createFactory();
Product pro = fac.createProduct(); // 由指定工厂生成出具体的产品
pro.use();
//
public interface Factory{
.............
public static Factory createFactory(){
if(....){
return new FactoryImplA();
}else{
return new FactoryImplB();
}
}
}
抽象工厂一般通过工厂方法来实现(还可以通过原型来构造),如果将工厂方法比作一个独立的小厂房,那么抽象工厂就是一个大集团了,在它旗下,集合了很多工厂,虽然生成不同的产品,但是都有该集团的徽号。譬如说,虽然lenovo的鼠标键盘是罗技的,显示器是philips做的,但是都打上了联想的标志。我们买了一套联想的PC,就整套都带有联想的风格,这跟Dell是不一样的。我们平时所说的“look and feel”也就这个道理。你相要哪种风格,就看你选的是哪个集团了。
Factory fac = Factory.createFactory();
Product pro = fac.createProduct(); // 由指定工厂生成出具体的产品
pro.use();
//
public interface Factory{
.............
public static Factory createFactory(){
if(....){
return new FactoryImplA();
}else{
return new FactoryImplB();
}
}
}