【设计模式】工厂模式

  |   0 评论   |   73 浏览

简介

工厂模式是最常用的一种设计模式,他属性创造型,他提供一种很好的方式去创建对象,使对象灵活,并可以重复利用,利于扩展,工厂方法解决了以下两个问题:
1、让实现这个接口的类来决定实例化哪个类;
2、工厂方法让类的实例化推迟到子类中进行

适用场景

1、创建对象需要大量重复的代码;
2、客户端不依赖于产品类实例如何被创建、实现等细节;
3、一个类通过其子类来指定创建哪个对象;
客户端只要知道我要创建的类在哪个工厂类里,需要的时候进行动态指定。

优点

1、用户只需要关心所需产品对应的工厂,无须关心创建细节;
2、加入新产品符合开闭原则,提供可扩展性;

缺点

1、类的个数容易过多,增加复杂度;
2、增加了系统的抽象性和理解难度;

代码示例

工厂方法是对产品等级来设计的,对简单工厂进行改造,变成工厂方法,先来看下类图:
image.png
来看下具体的类:
首先是一个抽象工厂类。

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。
image.png

slf4j中应用

ILoggerFactory是工厂接口,他的实现由子类来完成,具体的关系来看下面的类图。
image.png

也可以关注我的公众号:程序之声
图片
关注公众号,领取更多资源

本文为博主原创文章,未经博主允许不得转载。

评论

发表评论