设计模式-简单工厂
本文最后更新于 1180 天前,其中的信息可能已经有所发展或是发生改变。

简单工厂模式,虽然不在23种设计模式中。但是可以认为是工厂模式的一种特殊实现,并且在日常中使用广泛,所以还是值得我们去学习的。

解释

  • 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,是一种创建型的设计模式,关注于实例对象创建。
  • 由一个工厂对象通过判断传入的参数,决定创建出哪一种产品类的实例,将创建的细节透明化

优点:

  1. 一个调用者想创建一个对象,只要知道其名称就可以了
  2. 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口

缺点:

工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,违背开闭原则,如果产品数量过多,维护将变得非常困难。

列子实现:

模拟场景:

现在汽车品牌千千万…我才不知你要那辆…

UML图:

image-20211025174005561

基础的汽车类:

public interface  BaseCar {
    /**
     * 开车...
     */
    void driving();
}

宝马:

public class BMWCar implements BaseCar{

    @Override
    public void driving() {
        System.out.println("BMW开车……");
    }
}

奔驰:

public class MercedesCar implements BaseCar{

    @Override
    public void driving() {
        System.out.println("Mercedes开车……");
    }
}

汽车简单工厂类:

public class CarFactory {

    /**
     *
     * @param carName 汽车品牌名称
     * @return 汽车品牌类型
     */
    public BaseCar getCar(String carName){
        if ("BMW".equalsIgnoreCase(carName)) {
            return new BMWCar();
        }else if("Mercedes".equalsIgnoreCase(carName)){
            return new MercedesCar();
        }else {
            throw new IllegalArgumentException("无法找到这"+carName+"类car。");
        }
    }

}

测试及其结果:

public class Test {
    public static void main(String[] args) {

        BaseCar bmw = new CarFactory().getCar("BMW");
        bmw.driving();

        BaseCar mercedes = new CarFactory().getCar("Mercedes");
        mercedes.driving();

        //无法找到这glj类car。
        BaseCar glj = new CarFactory().getCar("glj");
        mercedes.driving();
    }
}
---------------
BMW开车……
Mercedes开车……
Exception in thread "main" java.lang.IllegalArgumentException: 无法找到这glj类car。
    at com.glj.factory.CarFactory.getCar(CarFactory.java:22)
    at com.glj.factory.Test.main(Test.java:18)

汽车简单工厂类-switch:

总感觉每次if都不怎么优雅好看,换个switch看看效果…

public class CarFactory {

    /**
     *
     * @param carName 汽车品牌名称
     * @return 汽车品牌类型
     */
    public BaseCar getCar(String carName){
        switch (carName){
            case "BMW":
                return new BMWCar();
            case "Mercedes":
                return new MercedesCar();
            default:
                throw new IllegalArgumentException("无法找到这"+carName+"类car。");
        }
    }

}

汽车简单工厂类-反射:

public class CarFactory {

    /**
     *
     * @param carName 汽车品牌名称
     * @return 汽车品牌类型
     */
    public BaseCar getCar(String carName){
        BaseCar baseCar = null;
        try {
            baseCar = (BaseCar) Class.forName(carName).newInstance();
        } catch (InstantiationException e) {
            throw new IllegalArgumentException("无法找到这"+carName+"类car。");
        } catch (IllegalAccessException e) {
            throw new IllegalArgumentException("无法找到这"+carName+"类car。");
        } catch (ClassNotFoundException e) {
            throw new IllegalArgumentException("无法找到这"+carName+"类car。");
        }
        return baseCar;
    }

}

测试结果:
public class Test {
    public static void main(String[] args) {

        BaseCar bmw = new CarFactory().getCar("com.glj.factory.BMWCar");
        bmw.driving();

        BaseCar mercedes = new CarFactory().getCar("com.glj.factory.MercedesCar");
        mercedes.driving();

        //无法找到这glj类car。
        BaseCar glj = new CarFactory().getCar("glj");
        mercedes.driving();
    }
}

///
BMW开车……
Mercedes开车……
Exception in thread "main" java.lang.IllegalArgumentException: 无法找到这glj类car。
    at com.glj.factory.CarFactory.getCar(CarFactory.java:25)
    at com.glj.factory.Test.main(Test.java:19)
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇