您的位置:首页 > 其它

设计模式-工厂方法

2018-10-04 20:30 246 查看

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

二、类型: 创建型

三、适用场景:

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

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

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

四、优点:

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

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

五、缺点:

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

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

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

六、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);
}

  



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: