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 classPenCore{
String color;public abstract voidwriteWord(String s);
}
2.具体产品(ConcreteProduct)_1 : RedPenCore.java
public class RedPenCore extendsPenCore{
RedPenCore(){
color="红色";
}public voidwriteWord(String s){
System.out.println("写出"+color+"的字:"+s);
}
}
具体产品(ConcreteProduct)_2 :BluePenCore.java
public class BluePenCore extendsPenCore{
BluePenCore(){
color="蓝色";
}public voidwriteWord(String s){
System.out.println("写出"+color+"的字:"+s);
}
}
具体产品(ConcreteProduct)_3: BlackPenCore.java
public class BlackPenCore extendsPenCore{
BlackPenCore(){
color="黑色";
}public voidwriteWord(String s){
System.out.println("写出"+color+"的字:"+s);
}
}
3.构造者(Creator): BallPen.java
public abstract classBallPen{
BallPen(){
System.out.println("生产了一只装有"+getPenCore().color+"笔芯的圆珠笔");
}public abstract PenCore getPenCore(); //工厂方法
}
4.具体构造者(ConcreteCreator):
RedBallPen.javapublic class RedBallPen extendsBallPen{publicPenCore getPenCore(){return newRedPenCore();
}
}
BlueBallPen.javapublic class BlueBallPen extendsBallPen{publicPenCore getPenCore(){return newBluePenCore();
}
}
BlackBallPen.javapublic class BlackBallPen extendsBallPen{publicPenCore getPenCore(){return newBlackPenCore();
}
}
5.应用 Application.java
public classApplication{public static voidmain(String args[]){
PenCore penCore;
BallPen ballPen=newBlueBallPen();
penCore=ballPen.getPenCore();
penCore.writeWord("你好,很高兴认识你");
ballPen=newRedBallPen();
penCore=ballPen.getPenCore();
penCore.writeWord("How are you");
ballPen=newBlackBallPen();
penCore=ballPen.getPenCore();
penCore.writeWord("nice to meet you");
}
}
工厂方法模式的优点
•使用工厂方法可以让用户的代码和某个特定类的子类的代码解耦。
•工厂方法使用户不必知道它所使用的对象是怎样被创建的,只需知道该对象有哪些方法即可。