zoukankan      html  css  js  c++  java
  • 工厂方法模式-Factory Method

    一、定义

    定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法模式使得一个类的实例化延迟到了其子类

    二、类图

    工厂方法模式包含以下几个角色:

    • 抽象产品角色(Product):具体产品对象的共同父类或共同拥有的接口。
    • 具体产品角色(ConcreateProduct):实现抽象产品接口的具体产品类,包含产品的具体细节。
    • 抽象工厂角色(Factory):是工厂方法模式的核心,任何在模式中创建对象的工厂类必须实现这个接口。
    • 具体工厂角色(ConcreateFactory):实现抽象工厂接口的具体工厂类,用于创建具体产品对象。

    静态工厂方法中,静态工厂负责创建所有的产品。而在工厂方法模式中,通过类图可知,每个产品都由一个对应的工厂创建。

    三、示例

    下面通过汽车工厂生产汽车来说明工厂方法模式的应用。

    汽车(抽象产品)

    /**
     * 抽象产品
     */
    public interface Car {
    
        void showSlogan();
    
    }

    具体的汽车

    /**
     * 奥迪车(具体产品)
     */
    public class AudiCar implements Car {
        @Override
        public void showSlogan() {
            System.out.println("伟大,不是成就,而是经历。奥迪Q7!");
        }
    }
    
    /**
     * 奔驰车(具体产品)
     */
    public class BenZCar implements Car {
        @Override
        public void showSlogan() {
            System.out.println("全新梅赛德斯-奔驰GLE SUV,万千气象,纵横无疆。");
        }
    }
    
    /**
     * 宝马车(具体产品)
     */
    public class BMWCar implements Car {
        @Override
        public void showSlogan() {
            System.out.println("便捷畅享BMW之悦,让纯粹驾驶乐趣.时刻在您身边");
        }
    }

    汽车工厂(抽象工厂)

    /**
     * 汽车工厂(抽象工厂)
     */
    public interface CarFactory {
    
        Car ProduceCar();
    
    }

    具体的工厂

    /**
     * 奥迪工厂,生产奥迪车
     */
    public class AudiCarFactory implements CarFactory {
        @Override
        public Car ProduceCar() {
            return new AudiCar();
        }
    }
    
    /**
     * 奔驰工厂,生产奔驰车
     */
    public class BenZCarFactory implements CarFactory {
        @Override
        public Car ProduceCar() {
            return new BenZCar();
        }
    }
    
    /**
     * 宝马工厂,生产宝马车
     */
    public class BMWCarFactory implements CarFactory {
        @Override
        public Car ProduceCar() {
            return new BMWCar();
        }
    }

    客户端代码

    public class Client {
        public static void main(String[] args) {
            //奔驰车工厂,生产奔驰车
            CarFactory benzCarFactory = new BenZCarFactory();
            Car benzCar = benzCarFactory.ProduceCar();
            benzCar.showSlogan();
    
            //宝马车工厂,生产宝马车
            CarFactory bmwCarFactory = new BMWCarFactory();
            Car bmwCar = bmwCarFactory.ProduceCar();
            bmwCar.showSlogan();
    
            //奥迪车工厂,生产奥迪车
            CarFactory audiCarFactory = new AudiCarFactory();
            Car audiCar = audiCarFactory.ProduceCar();
            audiCar.showSlogan();
        }
    }

    每种汽车都是由与之对应的工厂生产出来的。

    四、优缺点

    优点:

    1.与简单工厂模式相比,工厂方法模式减轻了工厂类的负担,把某一类产品交由一个工厂生产,不同的工厂生产不同类别的产品。

    2.遵守了开闭原则。增加某一类产品时并不需要修改工厂类,只需要添加生产这类产品的工厂即可。

    缺点:

    随着产品种类的数量的增长,工厂类也会随之增加,将不利于系统的维护。

     ……更多设计模式的内容,可以访问Refactoring.Guru
  • 相关阅读:
    Codeforces 878A
    Codeforces 873B-Balanced Substring
    codeforces 868C
    51nod 1402 最大值(贪心)
    最小正子段和 贪心
    codeforces 819B
    Codeforces 785D
    Codeforces 864E
    863D
    UVA 1380 A Scheduling Problem
  • 原文地址:https://www.cnblogs.com/rouqinglangzi/p/11122106.html
Copyright © 2011-2022 走看看