1.工厂方法模式:定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。
在工厂方法模式中不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不通的工厂,从而让子工厂去创建对象。
/**抽象工厂可以是接口,也可以是抽象类或者具体类*/
public interface Factory{
public Product factoryMethod();
}
/**具体工厂类的实现*/
public class ConcreateFactory implements Factory{
public Product factoryMethod(){
return new ConcreateProduct();//不同的具体工厂可以返回不同的具体产品
}
}
/**客户端代码中测试*/
···
Factory factory;
factory = new ConcreateFactory();//也可以通过配置文件与反射机制实现
Product product;
Product = factory.factoryMethod();//获取与该具体工厂相匹配的具体产品
···
上面也可以通过配置文件来存储具体工厂类ConcreateFactory的类名,再通过反射机制创建具体的工厂对象。
2.工厂方法模式的应用实例:还是小明吃水果的问题。下面代码中水果工厂相当于水果树,苹果工厂或者桔子工厂相当于桔子树。小明要吃苹果,就要从苹果树上摘下苹果吃,即苹果工厂生产苹果。而苹果树(苹果工厂)继承水果树(抽象工厂),苹果继承水果,桔子同理。小明想吃香蕉,只要继承苹果树新栽种香蕉树(香蕉工厂即子工厂)后,从香蕉树上摘香蕉就可以了。
/**日志记录器接口,充当抽象产品角色*/
public interface Fruit {
public void eatFruit();
}
/**苹果,充当具体产品角色*/
public class AppleFruit implements Fruit {
public void eatFruit(){
System.out.println("吃了一个苹果");
}
}
/**桔子,充当具体产品角色*/
public class OrangeFruit implements Fruit {
public void eatFruit(){
System.out.println("吃了一个桔子");
}
}
/**水果工厂接口,相当于水果树,充当抽象工厂角色*/
public interface FruitFactory {
public Fruit createFruit();//抽象工厂方法
}
/**苹果树工厂类,充当具体工厂角色*/
public class AppleFruitFactory implements FruitFactory {
public Fruit createFruit(){
Fruit apple = new AppleFruit();//苹果树长出了一个苹果
System.out.println("苹果树长出了一个苹果");
return apple;
}
}
/**桔子树工厂类,充当具体工厂角色*/
public class OrangeFruitFactory implements FruitFactory {
public Fruit createFruit(){
Fruit orange = new OrangeFruit();//桔子树长出了一个桔子
System.out.println("桔子树长出了一个桔子");
return orange;
}
}
/**客户端测试类*/
public class Client{
public static void main(String args[]){
FruitFactory factory;
Fruit fruit;
factory = new OrangeFruitFactory();//也可以引入配置文件和反射机制实现
fruit = factory.createFruit();
fruit.eatFruit();
}
}
运行结果如下图:
简单工厂模式和工厂模式的异同你弄清楚了嘛?不急下一篇文章,我们还将会学习抽象工厂模式,然后再进行总结。