工厂方法模式(虚拟构造)
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到子类。
·模式结构的描述:
//1.抽象产品(Product)
public abstract class PenCore{
String color;
public abstract voidwriteWord(String s);
}
//2.具体产品(ConcerteProduct)
public class RedPenCore extends PenCore{
RedPenCore(){
color="红色";
}
public void writeWord(Strings){
System.out.println("写出"+color+"的字:"+s);
}
}
//3.具体产品(ConcerteProduct)
public class BluePenCore extends PenCore{
BluePenCore(){
color="蓝色";
}
public void writeWord(Strings){
System.out.println("写出"+color+"的字:"+s);
}
}
//4.具体产品(ConcerteProduct)
public class BlackPenCore extends PenCore{
BlackPenCore(){
color="黑色";
}
public void writeWord(Strings){
System.out.println("写出"+color+"的字:"+s);
}
}
//5.构造者(Creator)
public abstract class BallPen{
BallPen(){
System.out.println("生产了一只装有"+getPenCore().color+"笔芯的圆珠笔");
}
public abstract PenCoregetPenCore(); //工厂方法
}
//6.具体构造者(ConcreteCreator)
public class RedBallPen extends BallPen{
public PenCore getPenCore(){
return new RedPenCore();
}
}
//7.具体构造者(ConcreteCreator)
public class BlueBallPen extends BallPen{
public PenCore getPenCore(){
return new BluePenCore();
}
}
//8.具体构造者(ConcreteCreator)
public class BlackBallPen extends BallPen{
public PenCore getPenCore(){
return new BlackPenCore();
}
}
//9.模式的使用
public class Application{
public static voidmain(String args[]){
PenCore penCore;
BallPen ballPen=newBlueBallPen();
penCore=ballPen.getPenCore();
penCore.writeWord("你好,很高兴认识你");
ballPen=new RedBallPen();
penCore=ballPen.getPenCore();
penCore.writeWord("How areyou");
ballPen=new BlackBallPen();
penCore=ballPen.getPenCore();
penCore.writeWord("nice to meetyou");
}
}
模式的优点
·可以让用户的代码和某个特定类的子类代码解耦。
·用户不必知道它所使用的对象是怎样被创建的,只需知道该对象又那些方法即可。
使用的情景
·用户需要一个类的子类的实例,但不希望与该子类形成耦合。
·用户需要一个类的子类的实例,但不知道该类有哪些子类可用。
具体的实例
·Java集合框架。
·药品生产等。
源码下载: