《大话设计模式》第八章
package ch08;
public class LeiFeng {
public void sweep() {
System.out.println("扫地");
}
public void wash() {
System.out.println("洗衣");
}
public void buyRice() {
System.out.println("买米");
}
}
package ch08;
public class Undergraduate extends LeiFeng {
}
package ch08;
public class Volunteer extends LeiFeng {
}
package ch08;
public interface IFactory {
LeiFeng createLeiFeng();
}
package ch08;
public class UndergraduateFactory implements IFactory {
public LeiFeng createLeiFeng() {
return new Undergraduate();
}
}
package ch08;
public class VolunteerFactory implements IFactory {
public LeiFeng createLeiFeng() {
return new Volunteer();
}
}
package ch08;
/**
* 工厂模式
* @author Administrator
*
*/
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
IFactory factory = new UndergraduateFactory();
LeiFeng leiFeng = factory.createLeiFeng();
leiFeng.buyRice();
leiFeng.sweep();
leiFeng.wash();
}
}
上面代码中的LeiFeng,只能是可以实例化的类,而不能是抽象类或者接口。
工厂方法,在JDK中的经典例子,比如Integer.valueOf。
工厂方法模式与简单工厂模式很类似,但是工厂方法模式没有switch case的语句,而是直接在客户端new一个具体的工厂。
抽象工厂模式和工厂方法模式也很像,那么有什么区别吗?
工厂方法,返回一个具体的类型,比如Integer.valueOf,返回的是Integer的实例,而且Integer不是抽象类,是可以实例化的;
抽象工厂方法,返回的可能是任何的类型,Calendar.getInstance,返回的可能是BuddhistCalendar,也可能是JapaneseImperialCalendar,也可能是GregorianCalendar,而且Calendar是抽象类,不能实例化。