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

  • 相关阅读:
    关于新人的培养与程序的测试
    关于23种设计模式的有趣见解
    看足球学习管理团队
    《Effective C#》Item 1
    测试系列之五回归测试
    VS2005 VS2008新建网站和新建项目里选Web应用程序区别
    SaaS的研究
    DropDownList控件选中项的深入研究
    用ie9浏览器若出现看视频有声音没图像的问题处理
    zencart目录页出现c.html网址的解决方法
  • 原文地址:https://www.cnblogs.com/qjm201000/p/10053333.html
Copyright © 2011-2022 走看看