- 设计模式是一种经过时间实践证明有效解决软件设计问题的方法,提供了一套经验丰富的解决方案,可以用于解决常见的软件设计问题,从而使得代码更加灵活,可读性更高,让代码更容易维护和扩展。
- 设计模式的类型分为三种:
- 创建型:创建型关注对象的创建机制,旨在通过各种方式创建对象,而不是直接在代码中使用new关键字。
- 结构型:结构型关注对象和类之间的关系,旨在通过组合类和对象形成更大的结构,以便更好的实现系统的结构和功能。
- 行为型:行为型关注对象之间的通信和协作方式,旨在定义对象之间的算法和责任分配。
- 解耦:降低系统中的不同模块,组件或对象之间的依赖关系,使得他们之间的耦合度减少。
工厂模式包含模块
- 抽象产品(Product):定义通用产品接口,所有具体产品都要实现这个接口。
- 具体产品(Concrete Product):实现抽象产品接口的具体产品类。
- 抽象工厂(Abstract Factory):定义创建产品的方法,可以是接口或者抽象类。
- 具体工厂(Concrete Factory):实现抽象工厂接口,负责具体产品的创建。
简单工厂
- 定义:由一个工厂对象决定创建出哪一种产品类的实例。(
不属于23种设计模式
)
- 优势:只需要传入工厂类参数,对于如何创建对象的逻辑无需关心。
- 弊端:只能对少量对象进行管理,如果要增加新的产品时需要修改工厂类的判断逻辑,不易于扩展过于复杂的产品结构。
- 抽象产品-ICourse
public interface ICourse {
void record();
}
public class JavaCourse implements ICourse{
@Override
public void record() {
System.out.println("java课程录制");
}
}
public class CourseSimpleFactory {
public ICourse create(Class<? extends ICourse> clazz) {
try {
if (null != clazz) {
return (ICourse) clazz.newInstance();
}
} catch (InstantiationException | IllegalAccessException e) {
throw new RuntimeException(e);
}
return null;
}
}
工厂方法模式
- 类型:创建型
- 定义:工厂模式是定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化延迟到子类中进行。(工厂方法可以根据需求动态创建对象,而不需要在代码中直接使用具体类来创建对象)
- 应用场景:创建对象需要大量复用代码。
- 优势:底层代码无需关心产品类实例如何被创建,实现等细节。
- 弊端:类的数量过多,增加代码结构的复杂度,增加系统的抽象性和理解难度。
- 抽象工厂
public interface ICourseFactory {
public ICourse create();
}
public class JavaCourseFactory implements ICourseFactory{
@Override
public ICourse create() {
return new JavaCourse();
}
}
@Test
public void testJavaCourseCreate(){
ICourseFactory iCourseFactory = new JavaCourseFactory();
ICourse course = iCourseFactory.create();
course.record();
}
- 工厂模式类图
抽象工厂模式
- 定义:提供一个创建一系列相关或者相互依赖对象的接口,无需指定他们具体的类。
- 弊端:规定了所有可能被创建的产品集合,产品族中扩展新的产品很困难,需要修改抽象工厂的接口。(
违反开闭原则
)
- 优势:将具体产品在应用层代码隔离,无需关心创建细节;将一个系列的产品族统一到一起创建。
- 应用场景:
- 应用层不依赖于产品类实例如何被创建,实现等细节;
- 强调一系列相关的产品对象一起使用创建对象需要大量重复代码;
- 提供一个产品类库,所有产品以同样的接口出现,从而使客户端不依赖于具体实现。
- 产品族:指一组相关或相互依赖的产品集合。这些产品通常具有共同的主题、特性或用途,可以在同一个环境下相互配合使用。
- 假设某个公司生产手机及其配件,那么手机是一个产品,而手机壳、充电器、耳机等就是手机配件。这些产品共同构成了手机产品族,因为它们在功能、使用场景、品牌等方面有着共同的特点和关联。
- 抽象工厂接口
public abstract class AbstractCourseFactory {
public void init() {
System.out.println("初始化基础数据");
}
public abstract INote createNote();
public abstract IVideo createVideo();
}
public class JavaCourseFactory extends AbstractCourseFactory{
@Override
public INote createNote() {
super.init();
return new JavaNote();
}
@Override
public IVideo createVideo() {
super.init();
return new JavaVideo();
}
}
public interface INote {
void edite();
}
public class JavaNote implements INote {
@Override
public void edite() {
System.out.println("编辑java笔记");
}
}
public interface IVideo {
void play();
}
public class JavaVideo implements IVideo{
@Override
public void play() {
System.out.println("播放java视频");
}
}
@Test
public void testCreateJavaFactory(){
AbstractCourseFactory factory = new JavaCourseFactory();
factory.createNote().edite();
factory.createVideo().play();
}
- 抽象工厂类图: