zoukankan      html  css  js  c++  java
  • 设计模式-抽象工厂模式(AbstractFactory)

    抽象工厂模式是向客户端提供一个接口(FruitFactory),,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族(NorthFruit、SouthFruit)的产品对象。

    角色和职责:

    1.抽象工厂(factory)-FruitFactory:

       抽象工厂模式的核心,包含对多个产品接口的说明,任何工厂类都必须实现这个接口

    2.具体工厂(concrete factory)-NorthFruitFactory、SouthFruitFactory:

       负责实例化某个产品族(比如apple,apple的产品族是NorthApple、SouthApple)中的产品对象

    3.抽象产品(product)-Apple、Banana:

       抽象模式所创建的所有对象的父类,它负责所有实例所共有的公共接口

    4.具体产品(concrete product)-NorthApple、SouthApple、NorthBanana、SouthBanana:

    UML图:

    具体代码:

    /**
     * 水果接口
     */
    public interface Fruit {
        void pick();
    }
    /**
     * 抽象苹果类
     */
    public abstract class Apple implements Fruit{
        public abstract void pick();
    }
    /**
     * 抽象香蕉类
     */
    public abstract class Banana implements Fruit{
        public abstract void pick();
    }
    /**
     * 北方苹果
     */
    public class NorthApple extends Apple{
        @Override
        public void pick() {
            System.out.println("采摘北方苹果");
        }
    }
    /**
     * 采摘北方香蕉
     */
    public class NorthBanana extends Banana{
        @Override
        public void pick() {
            System.out.println("采摘北方香蕉");
        }
    }
    /**
     * 南方苹果
     */
    public class SouthApple extends Apple{
        @Override
        public void pick() {
            System.out.println("采摘南方苹果");
        }
    }
    /**
     * 南方香蕉
     */
    public class SouthBanana extends Banana{
        @Override
        public void pick() {
            System.out.println("采摘南方香蕉");
        }
    }
    /**
     * 水果工厂接口
     */
    public interface FruitFactory {
        Fruit getApple();
        Fruit getBanana();
    }
    /**
     * 北方水果工厂
     */
    public class NorthFruitFactory implements FruitFactory {
        @Override
        public Fruit getApple() {
            return new NorthApple();
        }
    
        @Override
        public Fruit getBanana() {
            return new NorthBanana();
        }
    }
    /**
     * 南方水果工厂
     */
    public class SouthFruitFactory implements FruitFactory{
        @Override
        public Fruit getApple() {
            return new SouthApple();
        }
    
        @Override
        public Fruit getBanana() {
            return new SouthBanana();
        }
    }
    public class Main {
        public static void main(String[] args) {
            FruitFactory northFruitFactory = new NorthFruitFactory();//北方水果工厂
            Fruit northApple = northFruitFactory.getApple();//生产苹果
            northApple.pick();
            Fruit northBanana = northFruitFactory.getBanana();//生产香蕉
            northBanana.pick();
    
            FruitFactory southFruitFactory = new SouthFruitFactory();//南方水果工厂
            Fruit southApple = southFruitFactory.getApple();//生产苹果
            southApple.pick();
            Fruit southBanana = southFruitFactory.getBanana();//生产香蕉
            southBanana.pick();
        }
    }

    结果:

    采摘北方苹果
    采摘北方香蕉
    采摘南方苹果
    采摘南方香蕉

    优缺点:

    优:

    • 抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建
    • 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象
    • 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

    缺:增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性

    应用场景:

    抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。

    应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。

    源码:https://github.com/qjm201000/design_pattern_abstractFactory.git

  • 相关阅读:
    疯狂Java讲义 读书笔记(一)
    Android5.0开发范例大全 读书笔记(六)
    Android5.0开发范例大全 读书笔记(五)
    Android5.0开发范例大全 读书笔记(四)
    Android5.0开发范例大全 读书笔记(三)
    Android5.0开发范例大全 读书笔记(二)
    Android5.0开发范例大全 读书笔记(一)
    Java基础总结(三)
    Java基础总结(二)
    Java基础总结(一)
  • 原文地址:https://www.cnblogs.com/qjm201000/p/10056431.html
Copyright © 2011-2022 走看看