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
  • 相关阅读:
    215. Kth Largest Element in an Array
    214. Shortest Palindrome
    213. House Robber II
    212. Word Search II
    210 Course ScheduleII
    209. Minimum Size Subarray Sum
    208. Implement Trie (Prefix Tree)
    207. Course Schedule
    206. Reverse Linked List
    sql 开发经验
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/10942424.html
Copyright © 2011-2022 走看看