Factory pattern(工厂方法模式)
工厂模式概念:
- 实例化对象,用工厂方法代替new操作
- 工厂模式包括工厂方法模式和抽象工厂模式
- 抽象工厂模式是工厂方法模式的扩展
两种工厂模式具体定义:
- 简单工厂(简单工厂不是设计模式而是编程习惯,有些人误以为是“工厂模式”):将共性的算法抽取,进行抽象定义在一个类作为工厂类,工厂类根据参数化方法来实例化对象
- 工厂方法模式(Factory Mode):定义一个用于创建对象的接口,让子类来决定实例化的类是哪一个。工厂方法将类实例化延迟到子类
- 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,无需指定具体类
工厂方法模式
工厂方法模式特点
- 特点: 创建与使用解耦
- 关键代码:创建过程在子类执行
- 使用场景:不同条件下创建不同实例时
1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
工厂方法模式类图
- 抽象工厂(Factory):提供创建产品的接口,调用者通过它访问具体工厂的工厂方法factoryMethod()来创建指定产品。
- 具体工厂(ConcreteFactory):实现抽象工厂的抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义产品的规范,描述产品的主要特性和功能。
- 具体产品(ConcreteProduct):实现抽象产品角色所定义的接口,由具体工厂来创建,与具体工厂一一对应。
简单工厂和工厂方法之间的差异: 简单工厂将全部的事情放在一个地方处理完;工厂方法创建一个框架,让子类决定要如何实现(将对象实例化延迟到子类), 简单工厂不具备工厂方法的弹性无法变更正在创建的产品
实例01:汽车工厂(简单工厂模式)
类图
实例代码
// 产品类
abstract class Car{
public String name;
public String color;
Car(String _name, String _color){
this.name = _name;
this.color = _color;
}
abstract void getInfo();
}
class BenzCar extends Car{
public BenzCar(String _name, String _color){
super(_name, _color);
}
@Override
void getInfo() {
System.out.println("汽车品牌:" + this.name + " ,汽车颜色: " + this.color);
}
}
class BMWCar extends Car{
public BMWCar(String _name, String _color){
super(_name, _color);
}
@Override
void getInfo() {
System.out.println("汽车品牌:" + this.name + " ,汽车颜色: " + this.color);
}
}
// 简单工厂类
class SimpleCarFactory{
/**
* carName: 车名称
* color: 车的颜色
* type: 汽车品牌
*/
@Override
public Car getCar(String carName, String color, String type) { // 参数化工厂方法: 根据传入的参数创建不同的对象
if("Benz".equals(type)){
return new BenzCar(carName, color);
}else if ("BMW".equals(type)){
return new BMWCar(carName, color);
}else{
System.out.println("No matching type!");
return null;
}
}
}
public class FactoryPatterDemoSpace {
public static void main(String[] args) {
SimpleCarFactory carFactory = new SimpleCarFactory();
Car car = carFactory.getCar("奔驰", "黑色", "Benz");
car.getInfo(); // 汽车品牌:奔驰 ,汽车颜色: 黑色
}
}
实例02:汽车工厂(工厂方法模式)
类图
实例代码
// 产品类
abstract class Car{
public String name; // 汽车名称
public String color; // 汽车颜色
Car(String _name, String _color){
this.name = _name;
this.color = _color;
}
abstract void getInfo();
}
// 产品具体类
class BenzCarInGermany extends Car{
public BenzCarInGermany(String _name, String _color){
super(_name, _color);
}
@Override
void getInfo() {
System.out.println("汽车名称:" + this.name
+ " ,汽车颜色: " + this.color
+ " ,汽车配置来源:德国🇩🇪-Germany");
}
}
// 产品具体类
class BenzCarInChina extends Car{
public BenzCarInChina(String _name, String _color){
super(_name, _color);
}
@Override
void getInfo() {
System.out.println("汽车名称:" + this.name
+ " ,汽车颜色: " + this.color
+ " ,汽车配置来源:中国🇨🇳-China");
}
}
// 产品具体类
class BMWCarInGermany extends Car{
public BMWCarInGermany(String _name, String _color){
super(_name, _color);
}
@Override
void getInfo() {
System.out.println("汽车名称:" + this.name
+ " ,汽车颜色: " + this.color
+ " , 汽车配置来源:德国🇩🇪-Germany" );
}
}
// 产品具体类
class BMWCarInChina extends Car{
public BMWCarInChina(String _name, String _color){
super(_name, _color);
}
@Override
void getInfo() {
System.out.println("汽车名称:" + this.name
+ " ,汽车颜色: " + this.color
+ " , 汽车配置来源:中国🇨🇳-China" );
}
}
// 工厂类
interface CarFactory{
Car createCar(String carName, String color, String place);
}
// 工厂子类用来决定实例化对象的类具体是哪一个(工厂方法模式将类实例化延迟到子类)
class BenzCarFactory implements CarFactory{
/**
* @param carName 汽车名称
* @param color 汽车颜色
* @param place 汽车配置来源地
* */
@Override
public Car createCar(String carName, String color, String place) {
if("Germany".equals(place)){
return new BenzCarInGermany(carName, color);
}else if("China".equals(place)){
return new BenzCarInChina(carName, color);
}else{
System.out.println("暂无!");
return null;
}
}
}
public class FactoryPatterDemoSpace {
public static void main(String[] args) {
CarFactory carFactory = new BenzCarFactory();
Car car01 = carFactory.createCar("奔驰233", "黑色", "China");
car01.getInfo(); // 汽车名称:奔驰233 ,汽车颜色: 黑色 ,汽车配置来源:中国🇨🇳-China
Car car02 = carFactory.createCar("奔驰666", "蓝色", "Germany");
car02.getInfo(); // 汽车名称:奔驰666 ,汽车颜色: 蓝色 ,汽车配置来源:德国🇩🇪-Germany
}
}
参考:https://www.runoob.com/design-pattern/factory-pattern.html
学而不思则罔,思而不学则殆!