前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java设计模式学习记录-抽象工厂模式

Java设计模式学习记录-抽象工厂模式

作者头像
纪莫
发布2018-07-04 18:07:48
4140
发布2018-07-04 18:07:48
举报
文章被收录于专栏:JimoerJimoer

前言

上篇博客介绍了简单工厂模式和工厂方法模式,这次介绍抽象工厂模式,抽象工厂模式和工厂方法模式的区别在于需要创建对象的复杂程度上。

抽象工厂模式

抽象工厂模式是围绕着一个超级工厂创建其他工厂。这个超级工厂被称为其他工厂的工厂,主要是为了解决接口选择问题。

举例说明:

还是继续上篇用户使用手的例子,现在生产手机的工厂发现,不同的手机使用的配件也不相同,需要单独的生产配件。例如iphonX使用的原深感摄像头,以及OLED显示屏,而iphone8使用的全新感光元件组成的摄像头,以及视网膜高清显示屏。这样就需要通过每个配件的配件工厂来提供相应的配件。为了在写代码实例时取名称简单,暂且定义iphoneX使用的是A摄像头和A显示器,而iphone8使用的是B摄像头和B感应器。

代码实例如下:

显示器

代码语言:javascript
复制
/**
 * 显示屏接口
 */
public interface Display {
}
代码语言:javascript
复制
/**
 * iphoneX显示器
 */
public class ADisplay implements Display {

    public ADisplay(){
        System.out.println("##### 制造OLED显示屏 #####");
    }
}
代码语言:javascript
复制
/**
 * iphone8显示器
 */
public class BDisplay implements Display {

    public BDisplay(){
        System.out.println("##### 制造高清视网膜显示器 #####");
    }
}

摄像头

代码语言:javascript
复制
/**
 * 摄像头接口
 */
public interface Camera {
}
代码语言:javascript
复制
/**
 * iphoneX摄像头
 */
public class ACamera implements Camera {

    public ACamera(){
        System.out.println("##### 制造原深感摄像头 #####");
    }
}
代码语言:javascript
复制
/**
 * iphone8摄像头
 */
public class BCamera implements Camera{
    public BCamera(){
        System.out.println("#####  制造搭配全新感光组件的摄像头 #####");
    }
}

工厂类

代码语言:javascript
复制
/**
 * 抽象工厂类
 */
public abstract class AbstractFactory {
    /**
     * 获得显示屏
     * @return
     */
    public abstract Display getDisplay();

    /**
     * 获得摄像头
     * @return
     */
    public abstract Camera getCamera();

}
代码语言:javascript
复制
/**
 * iphoneX配件工厂类
 */
public class IphoneXPartsFactory extends AbstractFactory{
    /**
     * 获得显示屏
     *
     * @return
     */
    @Override
    public Display getDisplay() {
        return new ADisplay();
    }

    /**
     * 获得摄像头
     *
     * @return
     */
    @Override
    public Camera getCamera() {
        return new ACamera();
    }
}
代码语言:javascript
复制
/**
 * iphone8配件工厂类
 */
public class Iphone8PartsFactory extends AbstractFactory{
    /**
     * 获得显示屏
     *
     * @return
     */
    @Override
    public Display getDisplay() {
        return new BDisplay();
    }

    /**
     * 获得摄像头
     *
     * @return
     */
    @Override
    public Camera getCamera() {
        return new BCamera();
    }
}

用户类

代码语言:javascript
复制
/**
 * 用户类
 */
public class Customer {
    
    /**
     * 制造配件
     * @param af
     */
    public static void madeIphone(AbstractFactory af){
        //制造iphone的配件
        af.getDisplay();
        af.getCamera();
    }

    public static void main(String[] args) {

        AbstractFactory  iphonePartsFactory = new IphoneXPartsFactory();
        //制造iPhoneX 的配件
        madeIphone(iphonePartsFactory);

        iphonePartsFactory = new Iphone8PartsFactory();
        //制造iPhone8 的配件
        madeIphone(iphonePartsFactory);

    }
}

运行结果:

代码语言:javascript
复制
##### 制造OLED显示屏 #####
##### 制造原深感摄像头 #####
##### 制造高清视网膜显示器 #####
#####  制造搭配全新感光组件的摄像头 #####

工厂模式也是属于创建模式,它是工厂方法模式的进一步推广。在当一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构,那么为了将消费这些产品对象的责任和黄金这些产品对象的责任分割开来,这个时候就可以使用抽象工厂模式了。这样在使用产品的一方不要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品。

工厂模式的关系类图如下:

抽象工厂模式中的角色和工厂方法模式中的角色是一样的,这里就不介绍了,可以看上一篇工厂方法模式的角色介绍。

抽象工厂模式的优点和缺点

优点:

分离接口和实现

客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向川普的接口编程而已。也就是说,客户端从具体的产品实现中解耦出来了。

使切换产品族变得容易

因为一个具体的工厂实现代表的是一个产品族,比如上面例子的从iphoneX的配件到iphone8的配件只需要切换一下具体工厂。

缺点:

抽象工厂模式的缺点是不太容易扩展新的产品。如果需要给整个产品族添加一个新的产品,那么久需要修改抽象工厂,这样就会导致修改所有的工厂实现类。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-06-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 抽象工厂模式
  • 抽象工厂模式的优点和缺点
    • 优点:
      • 分离接口和实现
      • 使切换产品族变得容易
    • 缺点:
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档