zoukankan      html  css  js  c++  java
  • Java设计模式学习记录-抽象工厂模式

    前言

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

    抽象工厂模式

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

    举例说明:

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

    代码实例如下:

    显示器

    /**
     * 显示屏接口
     */
    public interface Display {
    }
    /**
     * iphoneX显示器
     */
    public class ADisplay implements Display {
    
        public ADisplay(){
            System.out.println("##### 制造OLED显示屏 #####");
        }
    }
    /**
     * iphone8显示器
     */
    public class BDisplay implements Display {
    
        public BDisplay(){
            System.out.println("##### 制造高清视网膜显示器 #####");
        }
    }

    摄像头

    /**
     * 摄像头接口
     */
    public interface Camera {
    }
    /**
     * iphoneX摄像头
     */
    public class ACamera implements Camera {
    
        public ACamera(){
            System.out.println("##### 制造原深感摄像头 #####");
        }
    }
    /**
     * iphone8摄像头
     */
    public class BCamera implements Camera{
        public BCamera(){
            System.out.println("#####  制造搭配全新感光组件的摄像头 #####");
        }
    }

    工厂类

    /**
     * 抽象工厂类
     */
    public abstract class AbstractFactory {
        /**
         * 获得显示屏
         * @return
         */
        public abstract Display getDisplay();
    
        /**
         * 获得摄像头
         * @return
         */
        public abstract Camera getCamera();
    
    }
    /**
     * iphoneX配件工厂类
     */
    public class IphoneXPartsFactory extends AbstractFactory{
        /**
         * 获得显示屏
         *
         * @return
         */
        @Override
        public Display getDisplay() {
            return new ADisplay();
        }
    
        /**
         * 获得摄像头
         *
         * @return
         */
        @Override
        public Camera getCamera() {
            return new ACamera();
        }
    }
    /**
     * iphone8配件工厂类
     */
    public class Iphone8PartsFactory extends AbstractFactory{
        /**
         * 获得显示屏
         *
         * @return
         */
        @Override
        public Display getDisplay() {
            return new BDisplay();
        }
    
        /**
         * 获得摄像头
         *
         * @return
         */
        @Override
        public Camera getCamera() {
            return new BCamera();
        }
    }

    用户类

    /**
     * 用户类
     */
    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);
    
        }
    }

    运行结果:

    ##### 制造OLED显示屏 #####
    ##### 制造原深感摄像头 #####
    ##### 制造高清视网膜显示器 #####
    #####  制造搭配全新感光组件的摄像头 #####

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

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

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

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

    优点:

    分离接口和实现

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

    使切换产品族变得容易

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

    缺点:

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

  • 相关阅读:
    (原创)如何利用UDP协议封装一个数据包
    <acarousel> 轮播图片无法触屏滑动
    Groovy开发语言
    关于ViewStub标签
    关键字transient和Volatile
    Android中Activity启动模式
    Android 开源项目分类汇总
    AtomicInteger的并发处理
    Cygwin: died waiting for dll loading (转载)
    Android知识点(C2DM)
  • 原文地址:https://www.cnblogs.com/jimoer/p/9218280.html
Copyright © 2011-2022 走看看