简介
工厂模式是最常用的一种设计模式,他属性创造型,他提供一种很好的方式去创建对象,使对象灵活,并可以重复利用,利于扩展,工厂方法解决了以下两个问题:
1、让实现这个接口的类来决定实例化哪个类;
2、工厂方法让类的实例化推迟到子类中进行
适用场景
1、创建对象需要大量重复的代码;
2、客户端不依赖于产品类实例如何被创建、实现等细节;
3、一个类通过其子类来指定创建哪个对象;
客户端只要知道我要创建的类在哪个工厂类里,需要的时候进行动态指定。
优点
1、用户只需要关心所需产品对应的工厂,无须关心创建细节;
2、加入新产品符合开闭原则,提供可扩展性;
缺点
1、类的个数容易过多,增加复杂度;
2、增加了系统的抽象性和理解难度;
代码示例
工厂方法是对产品等级来设计的,对简单工厂进行改造,变成工厂方法,先来看下类图:
来看下具体的类:
首先是一个抽象工厂类。
public abstract class FoxconnFactory {
public abstract Mobile getMobile();
}
接着创建两个工厂类,分别是苹果和华为的工厂类,同时都继承FoxconnFactory这个抽象类,重写父类的方法,在方法中返回相应的手机实现类。
public class HuaweiMobileFactory extends FoxconnFactory {
@Override
public Mobile getMobile() {
return new HuaweiMobile();
}
}
public class IphoneMobileFactory extends FoxconnFactory {
@Override
public Mobile getMobile() {
return new IphoneMobile();
}
}
手机相关的类
public interface Mobile {
void produce();
}
public class HuaweiMobile implements Mobile {
public void produce() {
System.out.println("生产华为手机");
}
}
public class IphoneMobile implements Mobile {
public void produce() {
System.out.println("生产苹果手机");
}
}
接着再来一个测试类:
public class FactoryMethodTest {
public static void main(String[] args) {
FoxconnFactory iphoneMobileFactory = new IphoneMobileFactory();
Mobile iphoneMobile = iphoneMobileFactory.getMobile();
iphoneMobile.produce();
FoxconnFactory huaweiMobileFactory = new HuaweiMobileFactory();
Mobile huaweiMobile = huaweiMobileFactory.getMobile();
huaweiMobile.produce();
}
}
到此工厂方法的代码已经写完了。如果这时富士康要生产小米了,那么创建一个MiMobileFactory类,MiMobile实现类,对扩展是开放的。
上面示例源码
源码分析
jdk中应用
Collection表示FoxconnFactory,iterator()方法是FoxconnFactory类里面的getMobile()方法,ArrayList表示HuaweiMobileFactory,ArrayList中的Itr是具体的产品实现,Itr表示HuaweiMobile类,Iterator表示Mobile接口,从对比来看,Collection就是使用了工厂方法,还有ArrayDeque相当于IphoneMobileFactory。
slf4j中应用
ILoggerFactory是工厂接口,他的实现由子类来完成,具体的关系来看下面的类图。
注意:本文归作者所有,未经作者允许,不得转载