工厂方法模式(别名:虚拟构造)
定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。
一 、 概述
当系统准备为用户提供某个类的子类的实例,又不想让用户代码和该子类形成耦合时,就可以使用工厂方法模式来设计系统。工厂方法模式的关键是在一个接口或抽象类中定义一个抽象方法,该方法返回某个类的子类的实例,该抽象类或接口让其子类或实现该接口的类通过重写这个抽象方法返回某个子类的实例。
二、工厂方法模式的结构与使用
模式的结构中包括四种角色:
1.抽象产品(Product): PenCore.java
public abstract class PenCore{
String color;
public abstract voidwriteWord(String s);
}
2.具体产品(ConcreteProduct)_1 : RedPenCore.java
public class RedPenCore extends PenCore{
RedPenCore(){
color="红色";
}
public void writeWord(String s){
System.out.println("写出"+color+"的字:"+s);
}
}
2.具体产品(ConcreteProduct)_2 : BluePenCore.java
public class BluePenCore extends PenCore{
BluePenCore(){
color="蓝色";
}
public void writeWord(String s){
System.out.println("写出"+color+"的字:"+s);
}
}
2.具体产品(ConcreteProduct)_3: BlackPenCore.java
public class BlackPenCore extends PenCore{
BlackPenCore(){
color="黑色";
}
public void writeWord(String s){
System.out.println("写出"+color+"的字:"+s);
}
}
3.构造者(Creator):BallPen.java
public abstract class BallPen{
BallPen(){
System.out.println("生产了一只装有"+getPenCore().color+"笔芯的圆珠笔");
}
public abstract PenCoregetPenCore(); //工厂方法
}
4.具体构造者(ConcreteCreator):
RedBallPen.java
public class RedBallPen extends BallPen{
public PenCoregetPenCore(){
return new RedPenCore();
}
}
BlueBallPen.java
public class BlueBallPen extends BallPen{
public PenCoregetPenCore(){
return new BluePenCore();
}
}
BlackBallPen.java
public class BlackBallPen extends BallPen{
public PenCoregetPenCore(){
return new BlackPenCore();
}
}
5.应用 Application.java
public class Application{
public static void main(String args[]){
PenCorepenCore;
BallPenballPen=new BlueBallPen();
penCore=ballPen.getPenCore();
penCore.writeWord("你好,很高兴认识你");
ballPen=new RedBallPen();
penCore=ballPen.getPenCore();
penCore.writeWord("How areyou");
ballPen=new BlackBallPen();
penCore=ballPen.getPenCore();
penCore.writeWord("nice tomeet you");
}
}
三、工厂方法模式的优点