zoukankan      html  css  js  c++  java
  • 抽象工厂模式

    一、模式名

    抽象工厂, 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. 存在多种多组产品

  • 相关阅读:
    LeetCode15题: 寻找三数和,附完整代码
    LeetCode 11 水池蓄水问题
    分布式初探——分布式事务与两阶段提交协议
    高等数学——讲透求极限两大方法,夹逼法与换元法
    书籍推荐——一本老书,吴军老师《数学之美》
    概率统计——期望、方差与最小二乘法
    算法浅谈——递归算法与海盗分金问题
    机器学习基础——带你实战朴素贝叶斯模型文本分类
    线性代数精华——从正交向量到正交矩阵
    LeetCode10 Hard,带你实现字符串的正则匹配
  • 原文地址:https://www.cnblogs.com/glsy/p/11070956.html
Copyright © 2011-2022 走看看