创建型--工厂方法模式

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

模式的意图

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

模式设计的适用性

  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.java
public class RedPenCore extends PenCore{
    public RedPenCore() {
        color = "红色";
    }
    @Override
public 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.java
public class BlackPenCore extends PenCore{
    public BlackPenCore() {
        color = "黑色";
    }
    @Override
    public void writeWord(String s) {   
        System.out.println("写出" + color + "的字:" + s);
    }   
}

构造者

BallPen.java
public 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.java
public class BlackBallPen extends BallPen{
    @Override
    public PenCore getPenCore() {   
        return new BlackPenCore();
    }
}
RedBallPen.java
public class RedBallPen extends BallPen{
    public PenCore getPenCore() {       
        return new RedPenCore();
    }
}

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

优点

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值