单例模式属于创建型设计模式,它保证一个类仅有一个实例,并且提供一个全局访问点来获取该实例。下面为你详细阐述单例模式的好处和坏处。
工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,将对象的创建和使用分离。其核心思想是定义一个创建对象的接口,让子类决定实例化哪个类。这样做的好处是提高了代码的可维护性和可扩展性,使得代码更符合开闭原则,即对扩展开放,对修改关闭。
在 Java 里,线程池用到了工厂模式,特别是在创建线程时。java.util.concurrent
包中的 ThreadFactory
接口就是工厂模式的体现。下面详细讲解线程池中的工厂模式:
ThreadFactory
接口ThreadFactory
接口定义了创建线程的方法,代码如下:
public interface ThreadFactory {
Thread newThread(Runnable r);
}
该接口只有一个方法 newThread
,它接收一个 Runnable
对象作为参数,返回一个新的 Thread
对象。通过实现这个接口,我们可以自定义线程的创建逻辑。
ThreadFactory
ThreadPoolExecutor
类在创建线程池时可以传入一个 ThreadFactory
对象,以此来指定线程的创建方式。以下是 ThreadPoolExecutor
的构造函数:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
threadFactory, defaultHandler);
}
这里的 threadFactory
参数就是用来创建线程的工厂。
下面是一个使用自定义 ThreadFactory
的线程池示例:
import java.util.concurrent.*;
// 自定义 ThreadFactory
class CustomThreadFactory implements ThreadFactory {
private final String namePrefix;
private int counter = 0;
public CustomThreadFactory(String namePrefix) {
this.namePrefix = namePrefix;
}
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r, namePrefix + "-" + counter++);
// 可以在这里设置线程的其他属性,如优先级、是否为守护线程等
thread.setPriority(Thread.NORM_PRIORITY);
return thread;
}
}
public class ThreadPoolFactoryExample {
public static void main(String[] args) {
// 创建自定义 ThreadFactory
ThreadFactory customFactory = new CustomThreadFactory("CustomThread");
// 创建线程池
ExecutorService executorService = new ThreadPoolExecutor(
2,
5,
60L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(),
customFactory
);
// 提交任务
for (int i = 0; i < 5; i++) {
final int taskId = i;
executorService.submit(() -> {
System.out.println("Task " + taskId + " is running on thread: " + Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Task " + taskId + " is completed.");
});
}
// 关闭线程池
executorService.shutdown();
}
}
ThreadFactory
:CustomThreadFactory
类实现了 ThreadFactory
接口,在 newThread
方法中创建了一个新的线程,并为线程设置了自定义的名称和优先级。main
方法中,我们创建了一个 ThreadPoolExecutor
线程池,并传入了自定义的 ThreadFactory
。executorService.submit
方法提交了 5 个任务,每个任务会打印当前运行的线程名称和任务完成信息。executorService.shutdown
方法关闭线程池。ThreadFactory
,提高代码的复用性。 建造者模式的核心思想是将复杂对象的构建和表示分离,让相同的构建过程能创建出不同的表示。在 Android 和 Java 开发中,OkHttp
和 Retrofit
这两个网络请求库就很好地运用了建造者模式。下面将结合它们详细讲解。
OkHttp
是一个高效的 HTTP 客户端,它使用建造者模式来配置 OkHttpClient
实例。OkHttpClient
有很多可配置的属性,例如连接超时时间、读取超时时间、拦截器等。通过建造者模式,你可以逐步设置这些属性,最后构建出一个符合需求的 OkHttpClient
实例。
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
public class OkHttpBuilderExample {
public static void main(String[] args) {
// 使用建造者模式构建 OkHttpClient
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.build();
// 创建请求
Request request = new Request.Builder()
.url("https://www.example.com")
.build();
try {
// 发起请求
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
System.out.println(response.body().string());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
OkHttpClient.Builder
:这是 OkHttpClient
的建造者类,通过它可以逐步设置 OkHttpClient
的各种属性,比如连接超时时间、读取超时时间等。.build()
方法:调用此方法后,会根据之前设置的属性构建出一个 OkHttpClient
实例。Retrofit
是一个类型安全的 HTTP 客户端,它基于 OkHttp
构建。Retrofit
同样使用建造者模式来配置 Retrofit
实例。
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.http.GET;
interface ApiService {
@GET("users")
Call getUsers();
}
public class RetrofitBuilderExample {
public static void main(String[] args) {
// 使用建造者模式构建 Retrofit 实例
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.client(new OkHttpClient())
.build();
// 创建 API 服务实例
ApiService apiService = retrofit.create(ApiService.class);
// 发起请求
Call call = apiService.getUsers();
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
if (response.isSuccessful()) {
System.out.println(response.body());
}
}
@Override
public void onFailure(Call call, Throwable t) {
t.printStackTrace();
}
});
}
}
Retrofit.Builder
:这是 Retrofit
的建造者类,通过它可以设置 Retrofit
的各种属性,例如基础 URL、数据转换器工厂、使用的 OkHttpClient
等。.build()
方法:调用此方法后,会根据之前设置的属性构建出一个 Retrofit
实例。OkHttpClient
和 Retrofit
的各种属性,而不需要一次性传入所有参数。感谢观看!!!