创建型--工厂方法模式
2016-07-05 11:46
555 查看
设计模式从四个方面来说:这种设计模式的意图,设计模式的动机,设计模式的主要角色,这种设计模式的优缺点。
工厂方法使用户不知道它所使用的对象是怎样被创建的,只需知道该对象有哪些方法即可。
具体产品(ConcreteProduct):实现Product接口的类
构造者(Creator):定义一个称作工厂方法的抽象方法,该方法返回具体产品类的实例。
具体构造者(ConcreateCreator):重写工厂方法,返回具体产品的一个实例。
也就是说通常我们在使用工厂方法模式的时候一般要有这几大参与者。
从例子上再来看一下:
抽象产品
具体产品
构造者
具体构造者
我们通过抽象产品定义了一个笔芯的类,具体产品笔芯实现了抽象产品中的方法,并且定义了不同种类的笔芯。我们通过具体的构造者构造出不同的笔,每种笔内产生一个具体的笔芯的对象,我们可以通过这个对象实例调用具体产品中的方法。
具体的类图:
工厂方法使用户不必知道它所使用的对象是怎么样被创建的,只需知道该对象有哪些方法即可。
模式的意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。可以把它理解为一个工厂,可以生产出不同类型的产品。模式设计的适用性
使用工厂方法可以让用户的代码和某个特定类的子类的代码解耦。工厂方法使用户不知道它所使用的对象是怎样被创建的,只需知道该对象有哪些方法即可。
参与者
抽象产品(Product):抽象类或接口,负责定义具体产品必须实现的方法。具体产品(ConcreteProduct):实现Product接口的类
构造者(Creator):定义一个称作工厂方法的抽象方法,该方法返回具体产品类的实例。
具体构造者(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(); } }
我们通过抽象产品定义了一个笔芯的类,具体产品笔芯实现了抽象产品中的方法,并且定义了不同种类的笔芯。我们通过具体的构造者构造出不同的笔,每种笔内产生一个具体的笔芯的对象,我们可以通过这个对象实例调用具体产品中的方法。
具体的类图:
优点
使用工厂方法可以让用户的代码和某个特定类的子类代码解耦。工厂方法使用户不必知道它所使用的对象是怎么样被创建的,只需知道该对象有哪些方法即可。
相关文章推荐
- Linux_tar命令_linux压缩与解压缩
- C++中引用(&)的用法和应用实例
- 理解水平扩展和垂直扩展
- 图片鉴黄服务提供商
- Material Design学习笔记
- 钩子函数大全(2)
- openwebkitsharp 打不开本地网页文件
- Python类和实例
- Helpers\Assets
- alloc、init你弄懂50%了吗?
- 浏览器内核大揭秘
- linux下Scala的安装
- Redis 配置文件详解
- yum搭建lamp或lnmp环境
- 关于Http的七个误解
- shell编程——if语句 if -z -n -f -eq -ne -lt
- jsp自定义标签实例
- Problem B
- Java实现的公平锁
- nginx在linux安装笔记