23种设计模式之工厂方法模式
程序员文章站
2024-01-05 16:30:46
...
以前我不是很理解,为什么每次面试面试官一定要抽查求职者对设计模式的一个了解程度.我当时在想设计模式有那么重要嘛,平常工作中也很少用到呀.抱着这种不重视设计模式的态度,我一直都对设计模式都不够熟悉.直到最近在项目实际应用中运用了几个设计模式,才真正的理解它的好处,这里重点讲解23种设计模式中的工厂模式.
一、什么是工厂方法模式?
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。(通俗易懂的来讲就是: 程序在接口和子类之间加入了一个过渡端,通过此过渡端可以动态取得实现了共同接口的子类实例化对象。)
二、什么时候使用工厂模式?
如定义中说的,只有当无法预料所创建的实例时,才使用工厂模式。即:我们明确的计划不同条件下创建不同实例时,使用它。
经典的一个例子是:
日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。(这里都是记录日志,唯一不同的是他们的条件.即日志记录到什么地方去)
另一个例子:
数据库访问类:访问可能是SQLSERVER、ORACLE等,用记可以选择创建访问不同的数据库。(这里都是创建数据库访问类,唯一不同的是他们的条件.即创建SQLSERVER还是创建爱ORACLE数据库访问类)
最后一个生活中经常用的例子:平常生活中我们购买商品选择支付时,你选择的支付可能是支付宝支付,也可能选择的是微信支付等支付方式.(这里都是购买商品完成支付,唯一不同的是他们的条件.即支付方式)
三、如何使用工厂模式?
interface Animal { // 定义一个动物的接口
public void say(); // 说话方法
}
class Cat implements Animal { // 定义子类Cat
@Override
public void say() { // 覆写say()方法
System.out.println("我是猫咪,喵呜!");
}
}
class Dog implements Animal { // 定义子类Dog
@Override
public void say() { // 覆写say()方法
System.out.println("我是小狗,汪汪!");
}
}
class Factory { // 定义工厂类
public static Animal getInstance(String className) {
Animal a = null; // 定义接口对象
if ("Cat".equals(className)) { // 判断是哪个子类的标记
a = new Cat(); // 通过Cat子类实例化接口
}
if ("Dog".equals(className)) { // 判断是哪个子类的标记
a = new Dog(); // 通过Dog子类实例化接口
}
return a;
}
}
public class FactoryDemo {
public static void main(String[] args) {
Animal a = null; // 定义接口对象
a = Factory.getInstance(args[0]); // 通过工厂获取实例
if (a != null) { // 判断对象是否为空
a.say(); // 调用方法
}
}
}
参考博客来源1:https://www.cnblogs.com/tytr/p/6119573.html
参考博客来源2:https://www.cnblogs.com/weixing/archive/2013/03/03/2941874.html