• 抽象工厂模式


    一、模式名

    抽象工厂, Abstract Factory

    二、解决的问题

    抽象工厂由“抽象”和"工厂"两个词组成,前者代表了使用了抽象类,后者代表了实现了工厂组装零件的模式。都知道,工厂完成零部件的生产后,再组装成对应的产品,抽象工厂正是实现了这个过程。

    抽象工厂用于存在大量可拓展组件,并需要组装这些组件的场景。

    三、解决方案

    抽象工厂模式的UML图如下所示。

    clipboard

    代码如下:

    public class AbstractFactoryExer {
        public static void main(String[] args) {
            AbstractPhoneFactory factory = AbstractPhoneFactory.getFactory(2);
            AbstractCamera camera = factory.createCamera();
            AbstractMicrophone microphone = factory.createMicrophone();
            AbstractScreen screen = factory.createScreen();
    
            screen.show();
            microphone.talk();
            camera.photo();
        }
    }
    
    // 摄像头抽象类
    abstract class AbstractCamera {
        abstract void photo();
    }
    
    // 屏幕抽象类
    abstract class AbstractScreen {
        abstract void show();
    }
    
    // 麦克风抽象类
    abstract class AbstractMicrophone {
        abstract void talk();
    }
    
    // 抽象工厂抽象类
    abstract class AbstractPhoneFactory {
        abstract AbstractCamera createCamera();
        abstract AbstractScreen createScreen();
        abstract AbstractMicrophone createMicrophone();
        // 获取工厂
        static AbstractPhoneFactory getFactory(int type) {
            if (type == 0) {
                return new Huawei();
            } else if (type == 1) {
                return new Xiaomi();
            } else {
                return new Apple();
            }
        }
    }
    
    class SonyCamera extends AbstractCamera {
        @Override
        void photo() {
            System.out.println("photo by sony camera");
        }
    }
    
    class LeicaCamera extends AbstractCamera {
        @Override
        void photo() {
            System.out.println("photo by leica camera");
        }
    }
    
    class CanonCamera extends AbstractCamera {
        @Override
        void photo() {
            System.out.println("photo by canon camera");
        }
    }
    
    class KangningScreen extends AbstractScreen {
        @Override
        void show() {
            System.out.println("kangning show");
        }
    }
    
    class JDFScreen extends AbstractScreen {
        @Override
        void show() {
            System.out.println("jdf show");
        }
    }
    
    class SharpScreen extends AbstractScreen {
        @Override
        void show() {
            System.out.println("sharp show");
        }
    }
    
    class NingdeMicrophone extends AbstractMicrophone {
        @Override
        void talk() {
            System.out.println("ningde talk");
        }
    }
    
    class LenovoMicrophone extends AbstractMicrophone {
        @Override
        void talk() {
            System.out.println("lenovo talk");
        }
    }
    
    class FeTriangleMicrophone extends AbstractMicrophone {
        @Override
        void talk() {
            System.out.println("fetriangle talk");
        }
    }
    
    class Huawei extends AbstractPhoneFactory {
    
        public Huawei() {
            System.out.println("huawei");
        }
    
        @Override
        AbstractCamera createCamera() {
            return new LeicaCamera();
        }
    
        @Override
        AbstractScreen createScreen() {
            return new SharpScreen();
        }
    
        @Override
        AbstractMicrophone createMicrophone() {
            return new NingdeMicrophone();
        }
    }
    
    class Xiaomi extends AbstractPhoneFactory {
    
        public Xiaomi() {
            System.out.println("xiaomi");
        }
    
        @Override
        AbstractCamera createCamera() {
            return new SonyCamera();
        }
    
        @Override
        AbstractScreen createScreen() {
            return new JDFScreen();
        }
    
        @Override
        AbstractMicrophone createMicrophone() {
            return new FeTriangleMicrophone();
        }
    }
    
    class Apple extends AbstractPhoneFactory {
    
        public Apple () {
            System.out.println("apple");
        }
    
        @Override
        AbstractCamera createCamera() {
            return new CanonCamera();
        }
    
        @Override
        AbstractScreen createScreen() {
            return new SharpScreen();
        }
    
        @Override
        AbstractMicrophone createMicrophone() {
            return new FeTriangleMicrophone();
        }
    }

    抽象工厂模式在某些形式上和工厂方法模式很像,但是工厂方法模式只用于存在一组产品的情况,本质上不太符合工厂的特点,一般的工厂都会生产不止一组产品,一般都会有多种产品,所以提出了抽象工厂模式。

    抽象工厂模式可以用于存在多种产品的情景下,比如上面举的手机厂商的例子,像华为、小米、苹果等手机厂商,负责手机设计和组装的,涉及的手机零部件有很多,可能某些手机厂商会使用同一个下游公司的产品。这样使用抽象工厂模式,可以方便地构造新的工厂。

    抽象工厂模式可以方便地新增工厂,但是如果需要新增产品,需要修改的地方会有很多。

    常用场景:

    1. 存在多种多组产品

  • 相关阅读:
    如何在页面上输出html标签:符号实体【转】
    js sort方法根据数组中对象的某一个属性值进行排序【转】
    原生js判断某个元素是否有指定的class名的几种方法【转】
    js支持的编码转换方法【转】
    windows mysql提示:1045 access denied for user 'root'@'localhost' using password yes 解决方案【转】
    PHP 生成随机数rand()和mt_rand()的区别【转】
    php中var关键字用法【转】
    2020软件工程个人作业06——软件工程实践总结作业
    旺宝的家——事后诸葛亮
    旺宝的家—冲刺总结
  • 原文地址:https://www.cnblogs.com/glsy/p/11070956.html
Copyright © 2020-2023  润新知