美文网首页
java 设计模式:工厂方法模式

java 设计模式:工厂方法模式

作者: 王二蛋和他的狗 | 来源:发表于2021-04-20 14:28 被阅读0次

    前言

    简单工厂模式每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度,违背了“开闭原则”。
    “工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。

    优点:

    • 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
    • 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
    • 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。

    缺点:

    • 类的个数容易过多,增加复杂度
    • 增加了系统的抽象性和理解难度
    • 抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决。

    应用场景:

    • 客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等。
    • 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
    • 客户不关心创建产品的细节,只关心产品的品牌

    代码实现

    工厂方法模式的主要角色如下。

    1. 抽象工厂:提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
    2. 具体工厂:主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
    3. 抽象产品:定义了产品的规范,描述了产品的主要特性和功能。
    4. 具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
      [站外图片上传中...(image-20a0d5-1618900038323)]
      kotlin代码实现
    //抽象产品:提供了产品的接口
    interface IProduct{
        fun setPingPai(string: String)
        fun showName() :String
    }
    //具体产品1:实现抽象产品中的抽象方法
    class Dog : IProduct{
        var pinPai:String? = null
        override fun setPingPai(string: String) {
            this.pinPai = string
        }
    
        override fun showName() = "dog"
    
    }
    //具体产品2:实现抽象产品中的抽象方法
    class Cat : IProduct{
        var pinPai:String? = null
        override fun setPingPai(string: String) {
            this.pinPai = string
        }
        override fun showName() = "cat"
    }
    //抽象工厂:提供了厂品的生成方法
    interface IFactory{
        fun getPinPai():String
        fun createProduct(type:Int):IProduct
    }
    //具体工厂1:实现了厂品的生成方法
    class ABCFactory():IFactory{
        override fun getPinPai() = "ABC"
    
        override fun createProduct(type: Int): IProduct {
            return when(type){
                1-> Dog().apply { setPingPai(getPinPai()) }
                2-> Cat().apply { setPingPai(getPinPai()) }
                else -> throw NullPointerException()
            }
        }
    
    }
    //具体工厂2:实现了厂品的生成方法
    class CBDFactory():IFactory{
        override fun getPinPai() = "CBD"
        override fun createProduct(type: Int): IProduct {
            return when(type){
                1-> Dog().apply { setPingPai(getPinPai()) }
                2-> Cat().apply { setPingPai(getPinPai()) }
                else -> throw NullPointerException()
            }
        }
    
    }
    

    Android源码分析

    ThreadFactory

    [站外图片上传中...(image-584a70-1618900038323)]

    //抽象产品
    public interface Runnable {
        public abstract void run();
    }
     
    //抽象工厂
    public interface ThreadFactory {
        Thread newThread(Runnable r);
    }
    

    具体的实现

    //实现1 TaskThreadFactory
    class TaskThreadFactory(var name: String) : ThreadFactory {
        private val mThreadNumber = AtomicInteger(1)
        override fun newThread(r: Runnable): Thread {
            return Thread(r, name + "#" + mThreadNumber.getAndIncrement())
        }
    }
    //实现2 DiskLruCacheThreadFactory 
      private static final class DiskLruCacheThreadFactory implements ThreadFactory {
        @Override
        public synchronized Thread newThread(Runnable runnable) {
          Thread result = new Thread(runnable, "glide-disk-lru-cache-thread");
          result.setPriority(Thread.MIN_PRIORITY);
          return result;
        }
      }
    
    

    解释:

    参数Runnable r,我们可以创建很多此类线程的产品类,我们还可以创建工厂来创造某类专用线程

    相关文章

      网友评论

          本文标题:java 设计模式:工厂方法模式

          本文链接:https://www.haomeiwen.com/subject/dblnlltx.html