zoukankan      html  css  js  c++  java
  • 设计模式-工厂方法模式(FactoryMethod)

    工厂方法模式又称多态工厂模式。工厂方法模式是定义一个创建产品对象的接口(FruitFactory),将具体创建工作给具体的实现类(AppFactory,BananaFactory,PearFactory)。

    角色和职责:

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

      工厂方法模式的核心,任何工厂类必须实现这个接口

    2.具体工厂(concrete factory)-AppFactory、BananaFactory、PearFactory:

       负责实例化产品对象

    3.抽象产品(Pruduct)-Fruit:

      工厂方法模式所生产的所有对象的父类,负责所有实例共有的接口

    4.具体产品(concrete product)-App、 Banana、Pear:

      工厂方法模式所生产的具体对象

    UML图:

    具体代码:

    /**
     * 水果接口类
     */
    public interface Fruit {
        void pick();
    }
    /**
     * 苹果实现类
     */
    public class Apple implements Fruit{
    
        @Override
        public void pick() {
            System.out.println("采摘苹果");
        }
    }
    /**
     * 香蕉实现类
     */
    public class Banana implements Fruit{
        @Override
        public void pick() {
            System.out.println("采摘香蕉");
        }
    }
    /**
     * 梨子实现类
     */
    public class Pear implements Fruit{
        @Override
        public void pick() {
            System.out.println("采摘梨子");
        }
    }
    /**
     * 水果工厂接口
     */
    public interface FruitFactory {
        public Fruit getFruit();
    }
    /**
     * 苹果工厂
     */
    public class AppFactory implements FruitFactory{
        @Override
        public Fruit getFruit() {
            return new Apple();
        }
    }
    /**
     * 香蕉工厂
     */
    public class BananaFactory implements FruitFactory{
        @Override
        public Fruit getFruit() {
            return new Banana();
        }
    }
    /**
     * 梨子工厂
     */
    public class PearFactory implements FruitFactory{
        @Override
        public Fruit getFruit() {
            return new Pear();
        }
    }
    public class Main {
        public static void main(String[] args){
            FruitFactory appFactory = new AppFactory();//苹果工厂
            Fruit app = appFactory.getFruit();
            app.pick();//采摘
    
            FruitFactory bananaFactory = new BananaFactory();//香蕉工厂
            Fruit banana = bananaFactory.getFruit();
            banana.pick();//采摘
    
            FruitFactory pearFactory = new PearFactory();//梨子工厂
            Fruit pear = pearFactory.getFruit();
            pear.pick();//采摘
        }
    }

    结果:

    采摘苹果
    采摘香蕉
    采摘梨子

    优缺点

    优:更符合开-闭原则,新增产品时,只需要增加相应的产品类和对应的工厂类就行了。

    缺:添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类,系统类的个数将成对增加,在一定程度上增加了系统的复杂度。

    应用场景:

    • 当一个类不知道它所需要的对象的类时
      在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可;
    • 当一个类希望通过其子类来指定创建对象时
      在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。
    • 将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。

    项目源码:https://github.com/qjm201000/design_pattern_factoryMethod.git

  • 相关阅读:
    由发货单批量生成发票时提示“连接失败”
    如何处理委托代销业务
    用友出纳通重装恢复
    如何查看用友通数据的版本
    出纳通如何重新年结?
    一致性错误导致
    销售出库单无法删除!
    用dos命令给系统用户添加用户组
    用友删除年度数据,删除帐套
    出纳通年结后如何查看过去的年度数据?
  • 原文地址:https://www.cnblogs.com/qjm201000/p/10053333.html
Copyright © 2011-2022 走看看