work hard work smart

专注于Java后端开发。 不断总结,举一反三。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

设计模式-工厂方法

Posted on 2018-10-04 20:30  work hard work smart  阅读(136)  评论(0编辑  收藏  举报

一、定义: 定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行

二、类型: 创建型

三、适用场景:

  创建对象需要大量重复的代码

  客户端(应用层)不依赖于产品类实例如何被创建、实现等细节

  一个类通过其子类来指定创建哪个对象

四、优点:

  用户只需要关心所需要产品对应的工厂,无须关心创建细节。

  加入新的产品符合开闭原则,提高可扩展性

五、缺点:

  类的个数容易过多,增加复杂度

  增加了系统的抽象性和理解难度

  增加了系统的抽象性和理解难度

六、Code

对简单工厂进行改造

1. Video类

public abstract class Video {
    public abstract void  produce();
}

  

2. JavaVideo类

public class JavaVideo  extends Video {
    @Override
    public void produce() {
        System.out.println("录制Java视频");
    }
}

  

3. AndroidVideo类

public class AndroidVideo  extends Video {
    @Override
    public void produce() {
        System.out.println("录制Android视频");
    }
}

  

 4. VideoFactory 类。 这是一个抽象类

public  abstract  class VideoFactory {

    public abstract Video getVideo();

}

  

5. JavaVideoFactory 类

public class JavaVideoFactory  extends  VideoFactory{

    @Override
    public Video getVideo() {
        return new JavaVideo();
    }
}

 

6.AndroidVideoFactory  类

public class AndroidVideoFactory  extends  VideoFactory{
    @Override
    public Video getVideo() {
        return new AndroidVideo();
    }
}

  

 7. JavaScriptFactory 类

public class JavaScriptFactory extends VideoFactory {
    @Override
    public Video getVideo() {
        return new JavaScriptVideo();
    }
}

  

8. 测试类

public class Test {

    public static void main(String[] args) {
        VideoFactory videoFactory = new JavaVideoFactory();
        Video video = videoFactory.getVideo();
        video.produce();

        videoFactory = new AndroidVideoFactory();
         video = videoFactory.getVideo();
        video.produce();

        videoFactory = new JavaScriptFactory();
         video = videoFactory.getVideo();
        video.produce();


    }
}

  

9. UML图

 

九、工厂方法在JDK中的实例

1. Collection类中的Iterator<E> iterator();方法是一个工厂方法

Collection的实现ArrayList类中的iterator方法  

public Iterator<E> iterator() {
return new Itr();
}

ArrayList可以被认为是实现工厂

 

2. URLStreamHandlerFactory接口

public interface URLStreamHandlerFactory {
    URLStreamHandler createURLStreamHandler(String var1);
}

  

Factory 类实现了URLStreamHandlerFactory接口接口
private static class Factory implements URLStreamHandlerFactory {
        private static String PREFIX = "sun.net.www.protocol";

        private Factory() {
        }

        public URLStreamHandler createURLStreamHandler(String var1) {
            String var2 = PREFIX + "." + var1 + ".Handler";

            try {
                Class var3 = Class.forName(var2);
                return (URLStreamHandler)var3.newInstance();
            } catch (ReflectiveOperationException var4) {
                throw new InternalError("could not load " + var1 + "system protocol handler", var4);
            }
        }
    }

  


3. slf4j中的LoggerFactory类中的getLogger方法
    public static Logger getLogger(String name) {
        ILoggerFactory iLoggerFactory = getILoggerFactory();
        return iLoggerFactory.getLogger(name);
    }