1.Product 定义工厂方法所创建的对象的接口。
2.ConcreteProduct 实现Product接口。
3.Creator 声明工厂方法,该方法返回一个Product类型的对象。 Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象。 可以调用工厂方法以创建一个Product对象。
4.ConcreteCreator 重定义工厂方法以返回一个ConcreteProduct实例。
工厂方法模式的结构与使用
模式的结构中包括四种角色:
•抽象产品(Product)
•具体产品(ConcreteProduct)
•构造者(Creator)
•具体构造者(ConcreteCreator)
模式的UML类图

实战部分
【例1】:假设有三个笔芯,分别是红笔芯、蓝笔芯和黑笔芯。用户希望通过圆珠笔来明确笔芯的颜色。
模式的结构的描述与使用
1.抽象产品(Product): PenCore.java
public abstract class PenCore{
String color;
public abstract void writeWord(String s);
}
2.具体产品(ConcreteProduct)_1 : RedPenCore.java
public class RedPenCore extends PenCore{
RedPenCore(){
color="红色";
}
public void writeWord(String s){
System.out.println("写出"+color+"的字:"+s);
}
}
具体产品(ConcreteProduct)_2 : BluePenCore.java
public class BluePenCore extends PenCore{
BluePenCore(){
color="蓝色";
}
public void writeWord(String s){
System.out.println("写出"+color+"的字:"+s);
}
}
具体产品(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 PenCore getPenCore(); //工厂方法
}
4.具体构造者(ConcreteCreator):
RedBallPen.java
public class RedBallPen extends BallPen{
public PenCore getPenCore(){
return new RedPenCore();
}
}
BlueBallPen.java
public class BlueBallPen extends BallPen{
public PenCore getPenCore(){
return new BluePenCore();
}
}
BlackBallPen.java
public class BlackBallPen extends BallPen{
public PenCore getPenCore(){
return new BlackPenCore();
}
}
5.应用 Application.java
public class Application{
public static void main(String args[]){
PenCore penCore;
BallPen ballPen=new BlueBallPen();
penCore=ballPen.getPenCore();
penCore.writeWord("你好,很高兴认识你");
ballPen=new RedBallPen();
penCore=ballPen.getPenCore();
penCore.writeWord("How are you");
ballPen=new BlackBallPen();
penCore=ballPen.getPenCore();
penCore.writeWord("nice to meet you");
}
}
工厂方法模式的优点
•使用工厂方法可以让用户的代码和某个特定类的子类的代码解耦。
•工厂方法使用户不必知道它所使用的对象是怎样被创建的,只需知道该对象有哪些方法即可。