建造器模式实战(Builder模式)

最近在阅读在Effective Java第三版,其中提到了建造器模式(建造者详解:https://blog.csdn.net/sinat_35821285/article/details/80004060),找了一个实际生产使用的例子。

(当遇到多个构造器参数时要考虑使用建造器模式,即Builder模式。)

1)最常见的字符串建造器:

使用:

public class Main {
    public static void main(String[] args) {
        var sb = new StringBuilder(1024);
        sb.append("Mr ")
          .append("Bob")
          .append("!")
          .insert(0, "Hello, ");
        System.out.println(sb.toString());
    }
}

2)线程工厂建造者的部分代码,完整代码请看Guava

public final class ThreadFactoryBuilder {
    // 线程名称前缀
    private String nameFormat = null;
    // 设置通过该线程工厂实例创建的线程是否为守护线程
    private Boolean daemon = null;
    // 设置通过该线程工厂实例创建的线程的优先级: 1~10
    private Integer priority = null;
    // 设置通过该线程工厂实例创建的线程的未捕获异常处理器
    private UncaughtExceptionHandler uncaughtExceptionHandler = null;
    // 设置真实运行的后台线程工厂实例
    private ThreadFactory backingThreadFactory = null;

    public ThreadFactoryBuilder() {}

    public ThreadFactoryBuilder setName(String name) {
        this.nameFormat = name + "-%d";
        return this;
    }

    public ThreadFactoryBuilder setDaemon(boolean daemon) {
        this.daemon = daemon;
        return this;
    }

    public ThreadFactoryBuilder setPriority(int priority) {
        this.priority = priority;
        return this;
    }

    public ThreadFactoryBuilder setUncaughtExceptionHandler(UncaughtExceptionHandler uncaughtExceptionHandler) {
        this.uncaughtExceptionHandler = Verify.notNull(uncaughtExceptionHandler);
        return this;
    }

    public ThreadFactoryBuilder setThreadFactory(ThreadFactory backingThreadFactory) {
        this.backingThreadFactory = Verify.notNull(backingThreadFactory);
        return this;
    }

    public ThreadFactory build() {
        return doBuild(this);
    }

    // 拆分,以便匿名ThreadFactory不能包含一个可以返回到Builder构造实例的引用。
    private static ThreadFactory doBuild(ThreadFactoryBuilder builder) {
        final String nameFormat = builder.nameFormat;
        final Boolean daemon = builder.daemon;
        final Integer priority = builder.priority;
        final UncaughtExceptionHandler uncaughtExceptionHandler = builder.uncaughtExceptionHandler;
        final ThreadFactory backingThreadFactory =
            (builder.backingThreadFactory != null) ? builder.backingThreadFactory : Executors.defaultThreadFactory();
        final AtomicLong count = (nameFormat != null) ? new AtomicLong(0) : null;
        return new ThreadFactory() {
            @Override
            public Thread newThread(Runnable runnable) {
                Thread thread = backingThreadFactory.newThread(runnable);
                if (nameFormat != null) {
                    thread.setName(format(nameFormat, count.getAndIncrement()));
                }
                if (daemon != null) {
                    thread.setDaemon(daemon);
                }
                if (priority != null) {
                    thread.setPriority(priority);
                }
                if (uncaughtExceptionHandler != null) {
                    thread.setUncaughtExceptionHandler(uncaughtExceptionHandler);
                }
                return thread;
            }
        };
    }
}

使用:我们利用建造者可以创建线程池,利用多线程来完成一些任务

public class ThreadFactoryBuilderTest {
	public static void main(String[] args) {
		// 创建Task
		Service service = new Service();
		// 线程工厂建造者
		ThreadFactory threadFactory = new ThreadFactoryBuilder().setName("test-pool") // 设置使用此ThreadFactory创建的线程时使用的命名前缀
				.setDaemon(false) // 设置通过该线程工厂实例创建的线程是否为守护线程
				.setPriority(1) // 设置通过该线程工厂实例创建的线程的优先级
				// .setThreadFactory(backingThreadFactory)
				.build(); // 建造者模式完成

		ExecutorService pool = Executors.newCachedThreadPool(threadFactory);

		for (int i = 0; i < 9; i++) {
			pool.submit(service);
		}
		pool.shutdown();
	}

	public static class Service implements Runnable {
		private static SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

		public void run() {
			System.out.println(Thread.currentThread().getName() + ":doSomething start-time:"
					+ sf.format(System.currentTimeMillis()));
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_270490096

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值