创建型--工厂方法模式

来源:互联网 发布:美工工资 编辑:程序博客网 时间:2024/05/20 09:09

设计模式从四个方面来说:这种设计模式的意图,设计模式的动机,设计模式的主要角色,这种设计模式的优缺点。

模式的意图

定义一个用于创建对象的接口,让子类决定实例化哪一个类。可以把它理解为一个工厂,可以生产出不同类型的产品。

模式设计的适用性

  1. 使用工厂方法可以让用户的代码和某个特定类的子类的代码解耦。
  2. 工厂方法使用户不知道它所使用的对象是怎样被创建的,只需知道该对象有哪些方法即可。

参与者

  1. 抽象产品(Product):抽象类或接口,负责定义具体产品必须实现的方法。
  2. 具体产品(ConcreteProduct):实现Product接口的类
  3. 构造者(Creator):定义一个称作工厂方法的抽象方法,该方法返回具体产品类的实例。
  4. 具体构造者(ConcreateCreator):重写工厂方法,返回具体产品的一个实例。

也就是说通常我们在使用工厂方法模式的时候一般要有这几大参与者。
从例子上再来看一下:
抽象产品

public abstract class PenCore {    public String color;    public abstract void writeWord(String s);}

具体产品

RedPenCore.javapublic class RedPenCore extends PenCore{    public RedPenCore() {        color = "红色";    }    @Overridepublic void writeWord(String s) {        System.out.println("写出" + color + "的字:" + s);    }}BluePenCore.java public class BluePenCore extends PenCore{        public BluePenCore() {                color = "蓝色";        }         @Override             public void writeWord(String s) {                      System.out.println("写出" + color + "的字:" + s);            } }BlackPenCore.javapublic class BlackPenCore extends PenCore{    public BlackPenCore() {        color = "黑色";    }    @Override    public void writeWord(String s) {           System.out.println("写出" + color + "的字:" + s);    }   }

构造者

BallPen.javapublic abstract class BallPen {    public BallPen() {System.out.println("生产了一只装有" + getPenCore().color + "笔芯的圆珠笔");    }    public abstract PenCore getPenCore();   }

具体构造者

BlueBallPen.java    public class BlueBallPen extends BallPen{        @Override        public PenCore getPenCore() {                   return new BluePenCore();    }}BlackBallPen.javapublic class BlackBallPen extends BallPen{    @Override    public PenCore getPenCore() {           return new BlackPenCore();    }}RedBallPen.javapublic class RedBallPen extends BallPen{    public PenCore getPenCore() {               return new RedPenCore();    }}

我们通过抽象产品定义了一个笔芯的类,具体产品笔芯实现了抽象产品中的方法,并且定义了不同种类的笔芯。我们通过具体的构造者构造出不同的笔,每种笔内产生一个具体的笔芯的对象,我们可以通过这个对象实例调用具体产品中的方法。
具体的类图:
这里写图片描述

优点

  1. 使用工厂方法可以让用户的代码和某个特定类的子类代码解耦。
  2. 工厂方法使用户不必知道它所使用的对象是怎么样被创建的,只需知道该对象有哪些方法即可。
0 0