设计模式学习(四)工厂模式

介绍

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

举个例子:你想要造一辆汽车,可以直接告诉工厂制造,然后去取车即可,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。

类图说明

在这里插入图片描述
图中用了一个车工厂造车的例子来画的一个类图,首先定义一个Car接口,该接口定义两个方法,一个getName()方法,另一个getColor()方法,分别定义三个车的种类,宝马,奔驰,特斯拉去实现它。然后再定义一个造车的工厂,你告诉车工厂要造什么车,通过方法参数告诉它,那它就造什么车给你,所以对应到前面咱们举的例子,这个就是工厂要做的事情,帮我们封装好了造车是怎么实现出来的,而我们如果想要造车,造什么样的车,通过FactoryPattern的main方法调用工厂类造对应的种类车即可。

代码示例

接下来咱们看下具体的代码示例:

public interface Car {
    
    
    void getName();
    void getColor();
}
public class BMW implements Car{
    
    
    @Override
    public void getName() {
    
    
        System.out.println("我是宝马");
    }

    @Override
    public void getColor() {
    
    
        System.out.println("我是黑色车");
    }
}
public class Benz implements Car{
    
    
    @Override
    public void getName() {
    
    
        System.out.println("我是奔驰");
    }

    @Override
    public void getColor() {
    
    
        System.out.println("我是绿色车");
    }
}
public class CarFactory {
    
    

        public static <T extends Car> T createCar(Class<T> c){
    
    
            Car car = null;
            try {
    
    
                car = (Car) Class.forName(c.getName()).newInstance();
            } catch (Exception e) {
    
    
                System.out.println("造车失败");
            }
            return (T)car;
        }

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

        BMW bmw = CarFactory.createCar(BMW.class);
        bmw.getName();
        bmw.getColor();

    }
}

造着类图敲一遍进一步加深对工厂模式的理解。

应用场景

  • 日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
  • 数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
  • 设计一个连接服务器的框架,需要三个协议,“POP3”、“IMAP”、“HTTP”,可以把这三个作为产品类,共同实现一个接口。

优缺点

优点

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

缺点

每次增加一个产品时,都需要增加一个具体类,使得系统中类的个数大大增加,在一定程度上增加了系统的复杂度。

拓展

以上例子通过一个工厂同时造宝马车,奔驰车,特斯拉,在现实生活中是不太现实的,那么我们可以将不同车的种类都各自拓展升级不同的工厂类出来,另外顺便提一下可以替代单例模式,也就是说一个单例类不再自行实例化,交给工厂类提供反射的方法实例化,且保证每次实例化都是同一个对象即可。
这里拿一个《设计模式之禅》里的例子看一下:
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/he_cha_bu/article/details/114417694
今日推荐