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

    前面的工厂模式出现一个情况,工厂只能生产一种类别的产品(比如键盘)

    如果工厂要既能生产鼠标,又能生产键盘呢?如果需要有多个工厂,都能生产鼠标和键盘呢?这就用到了我们的抽象工厂模式。

    工厂方法模式和抽象工厂模式不好分清楚,它们的区别如下:
    工厂方法模式:
    一个抽象产品类,可以派生出多个具体类
    一个抽象工厂类,可以派生出多个具体类
    每个具体工厂类智能创建一个具体产品类的实例
    抽象工厂模式:
    多个抽象产品类,每个抽象产品类可以派生出多个具体产品类
    一个抽象工厂类,可以派生出多个具体工厂类
    每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下的多个产品

    例子:

       工厂是电脑工厂,能生产鼠标和键盘

       工厂又分别为罗技工厂和微软工厂,两个工厂生产的鼠标和键盘是分别两个厂商的

    代码:

    package com.zhen.build_template.abstract_factory;
    
    /**
     * @author zhen
     * @Date 2019/5/28 12:48
     */
    public interface PCFactory {
        Mouse getMouseInstance();
    
        KeyBoard getKeyBoardInstance();
    }
    
    package com.zhen.build_template.abstract_factory;
    
    /**
     * @author zhen
     * @Date 2019/5/28 12:49
     */
    public class LuoJiPCFactory implements PCFactory {
        @Override
        public Mouse getMouseInstance() {
            return new LuoJiMouse();
        }
    
        @Override
        public KeyBoard getKeyBoardInstance() {
            return new LuoJiKeyBoard();
        }
    }
    
    package com.zhen.build_template.abstract_factory;
    
    /**
     * @author zhen
     * @Date 2019/5/28 12:50
     */
    public class MicrosoftPCFactory implements PCFactory {
        @Override
        public Mouse getMouseInstance() {
            return new MicroSoftMouse();
        }
    
        @Override
        public KeyBoard getKeyBoardInstance() {
            return new MicroSoftKeyBoard();
        }
    }
    
    package com.zhen.build_template.abstract_factory;
    
    /**
     * @author zhen
     * @Date 2019/5/28 11:45
     */
    public abstract class Mouse {
        public abstract void click();
    }
    
    package com.zhen.build_template.abstract_factory;
    
    /**
     * @author zhen
     * @Date 2019/5/28 12:43
     */
    public class LuoJiMouse extends Mouse{
        @Override
        public void click() {
            System.out.println("罗技鼠标点击");
        }
    }
    
    package com.zhen.build_template.abstract_factory;
    
    /**
     * @author zhen
     * @Date 2019/5/28 12:44
     */
    public class MicroSoftMouse extends Mouse {
        @Override
        public void click() {
            System.out.println("微软鼠标宏");
        }
    }
    
    
    package com.zhen.build_template.abstract_factory;
    
    /**
     * @author zhen
     * @Date 2019/5/28 11:45
     */
    public abstract class KeyBoard {
        public abstract void press();
    }
    
    package com.zhen.build_template.abstract_factory;
    
    /**
     * @author zhen
     * @Date 2019/5/28 12:40
     */
    public class LuoJiKeyBoard extends KeyBoard {
        @Override
        public void press() {
            System.out.println("罗技键盘触感");
        }
    }
    
    
    package com.zhen.build_template.abstract_factory;
    
    
    
    /**
     * @author zhen
     * @Date 2019/5/28 12:41
     */
    public class MicroSoftKeyBoard extends KeyBoard {
        @Override
        public void press() {
            System.out.println("微软式触感");
        }
    }
    View Code
  • 相关阅读:
    HDU1875——畅通工程再续(最小生成树:Kruskal算法)
    CodeForces114E——Double Happiness(素数二次筛选)
    POJ3083——Children of the Candy Corn(DFS+BFS)
    POJ3687——Labeling Balls(反向建图+拓扑排序)
    SDUT2157——Greatest Number(STL二分查找)
    UVA548——Tree(中后序建树+DFS)
    HDU1312——Red and Black(DFS)
    生活碎碎念
    SQL基础四(例子)
    Linux系统中的一些重要的目录
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/10942424.html
Copyright © 2011-2022 走看看