从静态工厂说起,接前一篇的私有构造器,在网上查到的静态工厂方法并没有限制构造器的私有化,只是通过工厂方法来管理父类的子类。
简单工厂模式(又叫静态工厂模式)
主要由父类(抽象产品),子类(具体产品),工厂(创建对象)组成
以一个食物订购为例
父类:
/*
* 产品抽象类
*/
public interface Food {
//获得相应的食物
public void get();
}
/*
* 麦香鸡对抽象产品接口的实现
*/
public class McChicken implements Food{
//获取一份麦香鸡
@Override
public void get() {
// TODO Auto-generated method stub
System.out.println("我要一份麦香鸡");
}
}
/*
* 薯条对抽象产品的接口实现
*/
public class Chips implements Food {
//获取一份薯条
@Override
public void get() {
// TODO Auto-generated method stub
System.out.println("我想要一份薯条");
}
}
工厂:
public class FoodFactory {
public static Food getFood(String type){
if(type.equals("McChicken")){
return new McChicken();
}else if(type.equals("Chips")){
return new Chips();
}
return null;
}
}
测试类:
public class FoodFactoryTest {
private static Food mcChicken;
private static Food chips;
public static void main(String[] args) {
mcChicken=FoodFactory.getFood("McChicken");
chips=FoodFactory.getFood("Chips");
if(mcChicken!=null){
mcChicken.get();
}
if(chips!=null){
chips.get();
}
}
}
这里有一点要注意的是,多态的使用:前面工厂new的实例是子类,但返回的是父类,测试类用父类接收,然后调用方法。(当然了,测试类中的接收类也可以是子类,使用向下转型便可,结果一样)
这种方法看起来是很好的,但是对于每次新增一种子类,都要在工厂中去改写,违背了开闭原则,首先想到的是使用再写一个factory,那么就是使工厂抽象化,UML如下图所示
进一步,很多工厂就会区分工厂的种类,便有了抽象工厂
上面两种方法代码示例见http://www.cnblogs.com/zhangchenliang/p/3700820.html
参考:
http://blog.163.com/zhuowh2006@126/blog/static/10182372420133220511247/
http://blog.youkuaiyun.com/superbeck/article/details/4446177