设计模式总览
不用设计模式并非不可以,但是使用设计模式可以更好地解决实际问题,设计模式最重要的是解耦,设计模式可以将业务需求转技术实现。
- 能够写出更优雅的代码
- 用好设计模式就是架构师,不然就是码农
- 设计模式遵循七大设计原则
设计模式分为创建型、结构型、行为型三大类。
简单工厂模式
简单工厂模式是指由一个工厂对象决定创建出哪一种产品类型的实例。属于创建型模式,但不属于GOF 23种设计模式之一。
优点:只需要传入一个参数,就可以得到想要的对象,不用关心如何创建。
缺点:工厂类职责过重,增加新的产品时需要修改工厂类的判断逻辑,违背开闭原则,不易于扩展过于负责的产品结构。
应用场景:简单工厂类适合创建对象较少的场景,客户端只用传入工厂类的参数(需要创建的类),不用关注如何创建类的细节。
public class SimpleFactoryDemo {
public static void main(String[] args) {
ICourse course = new CourseFactory().create(JavaCourse.class);
course.record();
}
}
public class CourseFactory {//创建工厂类
public ICourse create(Class<? extends ICourse> clazz) {
try {
return clazz.newInstance();//根据传入的对象类型反射创建具体对象
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
public interface ICourse {
void record();
}
public class JavaCourse implements ICourse {
@Override
public void record() {
System.out.println("java course");
}
}
工厂方法模式
基于简单工厂模式的缺点,所以引入了工厂方法模式,是简单工厂模式的升级。
定义:定义一个创建对象的工厂接口,但让实现这个接口的工厂类来实现具体实例化哪个类型的对象,工厂方法让类的实例化推迟到了子类中进行。
优点:用户只需要关心所需产品对应的工厂,无需关心创建细节。加入新产品符合开闭原则,提高了系统可扩展性。
缺点:类的个数容易多,因为一个产品一个工厂,增加了代码结构复杂度,增加了系统的抽象性和理解难度。
应用场景:创建对象需要大量重复的代码。
public class FactoryMethodDemo {
public static void main(String[] args) {
ICourseFactory factory = new JavaCourseFactory(); //声明工厂接口,创建工厂实现类
factory.create().record();
}
}
public interface ICourseFactory {//定义创建对象的工厂接口
ICourse create();
}
public class JavaCourseFactory implements ICourseFactory {//创建每个类型对应的创建工厂类
@Override
public ICourse create() {//实现创建方法,具体创建哪个类型的对象
return new JavaCourse();
}
}
public class PythonCourseFactory implements ICourseFactory {//创建每个类型对应的创建工厂类
@Override
public ICourse create() {//实现创建方法,具体创建哪个类型的对象
return new PythonCourse();
}
}
抽象工厂模式
抽象工厂模式是指提供一个创建一系列相关或相互依赖对象的接口,无需指定具体的类。
缺点:规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口。增加了系统抽象性和理解难度。
优点:具体产品在应用层代码隔离,无需关心创建细节。将一个系列的产品族统一到一起创建。
适用场景:应用层不依赖于产品类实例如何被创建,强调一系列相关产品对象一起使用创建对象需要大量重复代码。
public class AbstractFactoryDemo {
public static void main(String[] args) {
ICourseFactory factory = new JavaCourseFactory();
factory.createCourse().record();
factory.createVideo().listen();
}
}
public interface ICourseFactory {
ICourse createCourse(); //创建课程类对象
IVideo createVideo(); //创建视频类对象
}
public class JavaCourseFactory implements ICourseFactory {
@Override
public ICourse createCourse() { return new JavaCourse(); }
@Override
public IVideo createVideo() { return new JavaVideo(); }
}
public class PythonCourseFactory implements ICourseFactory {
@Override
public ICourse createCourse() { return new PythonCourse(); }
@Override
public IVideo createVideo() { return new PythonVideo(); }
}
public interface ICourse {void record();}
public interface IVideo {void listen();}