设计模式(二)工厂模式详解
简单工厂模式指由一个工厂对象来创建实例,适用于工厂类负责创建对象较少的情况。例子:Spring 中的 BeanFactory 使用简单工厂模式,产生 Bean 对象。
工厂模式简介
-
定义:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建对象时,不需要指定具体的类,而是通过一个专门的工厂类来创建对象。
-
主要用途:当一个类的实例化过程较为复杂或需要根据不同的条件创建不同的对象时,可以使用工厂模式来封装对象的创建逻辑。
-
实现了创建者和调用者的分离
-
详细分类:
-
简单工厂模式
用来生产同一等级结构中的任意产品(对于增加新的产品,需要扩展已有代码)
-
工厂方法模式
用来生产同一个等级结构中的固定产品(支持增加任意产品)
-
抽象工厂模式
围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。
-
核心本质:
-
实例化对象不使用new,用工厂方法代替。
-
将选择实现类,创作对象统一管理和控制,从而将调用者跟我们的实现类解耦
简单工厂模式:
// car接口
public interface Car {
void name();
}
// 两辆车实现car接口
// 特斯拉
public class Tesla implements Car{
@Override
public void name() {
System.out.println("特斯拉");
}
}
// 五菱
public class WuLing implements Car{
@Override
public void name() {
System.out.println("五菱宏光");
}
}
// 一个汽车工厂进行造汽车
package com.briup.patterns_design.factory.simple;
/**
* @author 35329
*
* 简单工厂模式 也是 静态工厂模式 (没有满足开闭原则)
* 增加了一个新的产品,如果你不修改代码,就实现不了,做不到
*
* 但是大多数使用的就是简单工厂模式
*/
public class CarFactory {
// 方法一:
public static Car getCar(String car){
if ("五菱".equals(car)){
return new WuLing();
}else if ("特斯拉".equals(car)){
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) {
// 接口。实现所有的实现类
Car car = new WuLing();
Car car2 = new Tesla();
car.name();
car2.name();
System.out.println("==============================");
// 使用工厂创建
Car car3 = CarFactory.getCar("五菱");
Car car4 = CarFactory.getCar("特斯拉");
car3.name();
car4.name();
}
}
工厂方法模式:
// 车car接口
public interface Car {
void name();
}
// 车工厂接口
public interface CarFactory {
Car getCar();
}
// 两辆车实现car接口 重写car中的抽象方法
public class Tesla implements Car {
@Override
public void name() {
System.out.println("特斯拉");
}
}
public class WuLing implements Car {
@Override
public void name() {
System.out.println("五菱宏光");
}
}
// 两辆车的工厂实现车工厂接口 重写造车方法
public class TeslaFactory implements CarFactory{
@Override
public Car getCar() {
return new Tesla();
}
}
public class WuLingFactory implements CarFactory{
@Override
public Car getCar() {
return new WuLing();
}
}
// 消费者直接从不同品牌的车工厂中,拿到车;
public class Consumer {
public static void main(String[] args) {
Car car = new WuLingFactory().getCar();
Car car2 = new TeslaFactory().getCar();
car.name();
car2.name();
}
// 简单工厂模式和工厂方法模式比较:
// 结构复杂度: simple
// 代码复杂度:simple
// 编程、管理上的复杂度:simple
// 根据设计原则:工厂方法模式!
// 根据实际业务:简单工厂模式!
}
代码结构: