简介
说明
本文用示例介绍Java中工厂模式的用法。
需求
客户想获得一辆车。
原始方法:new一辆车
优点
写起来最简单。代码量最少。
缺点
若Car的构造参数很多,用户要自己写参数,就会特别麻烦。
所需的类
主类Consumer
package org.example.traditional;
import org.example.traditional.car.Car;
import org.example.traditional.car.Tesla;
import org.example.traditional.car.WuLing;
public class Consumer {
public static void main(String[] args) {
Car wuLing = new WuLing();
Car tesla = new Tesla();
wuLing.name();
tesla.name();
}
}
Car
接口
package org.example.traditional.car;
public interface Car {
void name();
}
实现类
package org.example.traditional.car;
public class WuLing implements Car {
@Override
public void name() {
System.out.println("五菱");
}
}
package org.example.traditional.car;
public class Tesla implements Car {
@Override
public void name() {
System.out.println("特斯拉");
}
}
测试
五菱
特斯拉
简单工厂模式
简介
针对上边“原始方法:new一辆车”的缺点,可使用简单工厂来解决。核心:加一层
加一层:使用工厂来包一层,将构造封装起来。
优点
用户不需要再去new一个Car,只需从工厂拿现成的。
缺点
若增加一类车,比如:大众,除了要增加Car的实现类之外,还要修改工厂类。违反开闭原则
所需的类
主类Consumer
package org.example.simple;
import org.example.simple.car.Car;
import org.example.simple.factory.CarFactory;
public class Consumer {
public static void main(String[] args) {
Car wuLing = CarFactory.getCar("五菱");
Car tesla = CarFactory.getCar("特斯拉");
wuLing.name();
tesla.name();
}
}
工厂类
package org.example.simple.factory;
import org.example.simple.car.Car;
import org.example.simple.car.Tesla;
import org.example.simple.car.WuLing;
public class CarFactory {
public static Car getCar(String car) {
switch (car) {
case "五菱":
return new WuLing();
case "特斯拉":
return new Tesla();
default:
return null;
}
}
}
Car类
接口
package org.example.simple.car;
public interface Car {
void name();
}
实现类
package org.example.simple.car;
public class WuLing implements Car {
@Override
public void name() {
System.out.println("五菱");
}
}
package org.example.simple.car;
public class Tesla implements Car {
@Override
public void name() {
System.out.println("特斯拉");
}
}
测试
五菱
特斯拉
工厂方法模式
简介
针对上边“简单工厂”的缺点,可使用工厂方法模式来解决。核心:加一层
加一层:写一个工厂类接口,具体工厂类去实现它。
优点
若增加一类车,比如:大众,增加Car的实现类、增加工厂类。不违反开闭原则(只增加即可,无需修改)
缺点
略麻烦。
所需的类
主类(Consumer)
package org.example.method;
import org.example.method.car.Car;
import org.example.method.factory.TeslaFactory;
import org.example.method.factory.WuLingFactory;
public class Consumer {
public static void main(String[] args) {
Car wuLing = new WuLingFactory().getCar();
Car tesla = new TeslaFactory().getCar();
wuLing.name();
tesla.name();
}
}
工厂类
接口
package org.example.method.factory;
import org.example.method.car.Car;
public interface CarFactory {
Car getCar();
}
实现类
package org.example.method.factory;
import org.example.method.car.Car;
import org.example.method.car.WuLing;
public class WuLingFactory implements CarFactory{
@Override
public Car getCar() {
return new WuLing();
}
}
package org.example.method.factory;
import org.example.method.car.Car;
import org.example.method.car.Tesla;
public class TeslaFactory implements CarFactory{
@Override
public Car getCar() {
return new Tesla();
}
}
Car类
接口
package org.example.method.car;
public interface Car {
void name();
}
实现类
package org.example.method.car;
public class WuLing implements Car {
@Override
public void name() {
System.out.println("五菱");
}
}
package org.example.method.car;
public class Tesla implements Car {
@Override
public void name() {
System.out.println("特斯拉");
}
}
测试
五菱
特斯拉
其他网址
【狂神说Java】通俗易懂的23种设计模式教学(停更)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili