二、工厂模式
创建者和调用者分离:
实例化对象不使用new关键字,使用工厂方法去代替。
1、简单工厂模式
直接上代码。
1.1新建一个Car接口:
package com.trs.mybatisplus.controller;
/**
* @author liang.peng
* @version 1.0
* @description 车接口
* @since 2022/7/13 11:56
**/
public interface Car {
void name();
}
1.2再2创建两个实现类去实现car接口
/**
* @author lenovo
* @version 1.0
* @description 实现Car
* @since 2022/7/13 12:00
**/
public class Tesla implements Car{
@Override
public void name() {
System.out.println("特斯拉!");
}
}
/**
* @author lenovo
* @version 1.0
* @description TODO
* @since 2022/7/13 11:59
**/
public class WuLing implements Car {
@Override
public void name() {
System.out.println("五菱宏光!");
}
}
传统使用上述两个实现类的方式是直接New关键字创建一个对象。
public class Consumer {
public static void main(String[] args) {
//原始的方法去实现WuLing和Tesla这两个类的时候
WuLing wuLing = new WuLing();
Tesla tesla = new Tesla();
System.out.println(wuLing);
System.out.println(tesla);
}
}
利用普通工厂模式去实现
在原有的基础上创建一个工厂类CarFactory
/**
* @author lenovo
* @version 1.0
* @description 创建对象工厂
* @since 2022/7/13 12:12
**/
public class CarFactory {
//方法一
public static Car getCar(String car){
if (car.equals("五菱")){
return new WuLing();
}else if (car.equals("特斯拉")){
return new Tesla();
}else {
return null;
}
}
//方法二
public static Car getWuLing(){
return new WuLing();
}
public static Car getTesla(){
return new Tesla();
}
}
public class Consumer {
public static void main(String[] args) {
//原始的方法去实现WuLing和Tesla这两个类的时候
// WuLing wuLing = new WuLing();
// Tesla tesla = new Tesla();
// System.out.println(wuLing);
// System.out.println(tesla);
Car wuLing = CarFactory.getCar("五菱");
System.out.println(wuLing);
Car tesla = CarFactory.getCar("特斯拉");
System.out.println(tesla);
}
}
注意以上简单工厂模式存在问题
当我i们需要新建一个实现类的时候就需要再CarFactory里面修改原有的类,违反了开放闭合原则。
可以通过工厂方法模式来解决改问题;
工厂方法模式
将原有的CarFactory改为接口
/**
* @author lenovo
* @version 1.0
* @description TODO
* @since 2022/7/13 13:12
**/
public interface CarFactory {
Car getCar();
}
然后创建每一个实现类对应的工厂类,并且都实习CarFactory接口;
TeslaFactory
public class TeslaFactory implements CarFactory{
@Override
public Car getCar() {
return new Tesla();
}
}
WuLingFactory
public class WuLingFactory implements CarFactory{
@Override
public Car getCar() {
return new WuLing();
}
}
实现一下
/**
* @author lenovo
* @version 1.0
* @description 使用WuLing和Teala
* @since 2022/7/13 12:01
**/
public class Consumer {
public static void main(String[] args) {
Car car1 = new WuLingFactory().getCar();
Car car2 = new TeslaFactory().getCar();
car1.name();
car2.name();
}
}