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

  • 相关阅读:
    Django ORM中常用的字段类型以及参数配置
    python enumerate用法总结
    Django 模板渲染
    Django null=True和blank=True的区别
    Django下关于session的使用
    方程组法求函数的解析式
    求数列通项公式的小众方法
    不等式性质
    多项选择题
    对勾型函数
  • 原文地址:https://www.cnblogs.com/qjm201000/p/10056431.html
Copyright © 2011-2022 走看看