设计模式之工厂模式(一)

简介: 设计模式之工厂模式

1.2 工厂模式

源代码地址:https://gitee.com/zyxscuec/Design-pattern.git

文章目录

1.2.1 简单工厂模式

(1)概念

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

(2)适用场景

我们明确地计划不同条件下创建不同实例时使用工厂模式。

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

**注意事项:**作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

(3)代码示例

整体类图

首先创建抽象类交通工具类:Vehicle

package com.alibaba.design.factorypattern.simplefactory;
/**
 * @author zhouyanxiang
 * @create 2020-07-2020/7/28-9:49
 */
public abstract class Vehicle {
    private String name;
    public Vehicle(String name) {
        this.name = name;
        System.out.println(name);
    }
    @Override
    public String toString(){
        return "Vehicle" + name;
    }
    abstract public Vehicle newInstance();
}

然后分别创建三个实体工具类Car、Bike、Truck

  • Car
package com.alibaba.design.factorypattern.simplefactory;
/**
 * @author zhouyanxiang
 * @create 2020-07-2020/7/28-9:50
 */
public class Car  extends Vehicle {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Car(String name) {
        super(name);
        System.out.println(name);
    }
    @Override
    public String toString(){
        return "Car:" + name;
    }
    @Override
    public Vehicle newInstance() {
        return new Car("Car ...");
    }
}
  • Bike
package com.alibaba.design.factorypattern.simplefactory;
/**
 * @author zhouyanxiang
 * @create 2020-07-2020/7/28-10:06
 */
public class Bike extends Vehicle {
    public Bike(String name) {
        super(name);
    }
    @Override
    public Vehicle newInstance() {
        return new Bike("Bike ...");
    }
}
  • Truck
package com.alibaba.design.factorypattern.simplefactory;
/**
 * @author zhouyanxiang
 * @create 2020-07-2020/7/28-10:07
 */
public class Truck extends Vehicle {
    public Truck(String name) {
        super(name);
    }
    @Override
    public Vehicle newInstance() {
        return new Truck("Truck ...");
    }
}
  • 创建交通工具工厂类VehicleFactory
    避免反射机制,使用注册新Vehicle类的类似工厂类,不再将类添加到map对象中,而是将要注册得到每种对象实例添加其中。每个产品类都能够创造自己的实例。
package com.alibaba.design.factorypattern.simplefactory;
import java.util.HashMap;
import java.util.Map;
/**
 * @author zhouyanxiang
 * @create 2020-07-2020/7/28-9:47
 */
public class VehicleFactory {
    private Map<String,Vehicle> registeredProducts = new HashMap<>();
    public Vehicle createVehicle(String vehicleName){
        return registeredProducts.get(vehicleName).newInstance();
    }
    public void registerVehicle(String vehicleName,Vehicle vehicle){
        registeredProducts.put(vehicleName,vehicle);
    }
}
  • 客户端测试类
package com.alibaba.design.factorypattern.simplefactory;
/**
 * @author zhouyanxiang
 * @create 2020-07-2020/7/28-9:54
 */
public class Test {
    public static void main(String[] args) {
        Vehicle vehicle = new Vehicle("A Car") {
            @Override
            public Vehicle newInstance() {
                return new Car(" audi ");
            }
        };
//        Vehicle vehicle2 = new Car("A Car");
//        System.out.println(vehicle.toString());
//        System.out.println(vehicle2.toString());
    }
}
(4)模式在源码中的体现

在JDK源码中 ,java.util.Calendar使用了工厂模式的简单工厂模式

public static Calendar getInstance(TimeZone zone,
                                   Locale aLocale)
{
    return createCalendar(zone, aLocale);
}
private static Calendar createCalendar(TimeZone zone,Locale aLocale){
    CalendarProvider provider =
        LocaleProviderAdapter.getAdapter(CalendarProvider.class, aLocale)
                             .getCalendarProvider();
    if (provider != null) {
        try {
            return provider.getInstance(zone, aLocale);
        } catch (IllegalArgumentException iae) {
            // fall back to the default instantiation
        }
    }
    Calendar cal = null;
    if (aLocale.hasExtensions()) {
        String caltype = aLocale.getUnicodeLocaleType("ca");
        if (caltype != null) {
            switch (caltype) {
            case "buddhist":
            cal = new BuddhistCalendar(zone, aLocale);
                break;
            case "japanese":
                cal = new JapaneseImperialCalendar(zone, aLocale);
                break;
            case "gregory":
                cal = new GregorianCalendar(zone, aLocale);
                break;
            }
        }
    }
    if (cal == null) {
        // If no known calendar type is explicitly specified,
        // perform the traditional way to create a Calendar:
        // create a BuddhistCalendar for th_TH locale,
        // a JapaneseImperialCalendar for ja_JP_JP locale, or
        // a GregorianCalendar for any other locales.
        // NOTE: The language, country and variant strings are interned.
        if (aLocale.getLanguage() == "th" && aLocale.getCountry() == "TH") {
            cal = new BuddhistCalendar(zone, aLocale);
        } else if (aLocale.getVariant() == "JP" && aLocale.getLanguage() == "ja"
                   && aLocale.getCountry() == "JP") {
            cal = new JapaneseImperialCalendar(zone, aLocale);
        } else {
            cal = new GregorianCalendar(zone, aLocale);
        }
    }
    return cal;
}
(5)简单工厂模式的优缺点
  • 优点:
    1、一个调用者想创建一个对象,只要知道其名称就可以了。
    2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
    3、屏蔽产品的具体实现,调用者只关心产品的接口。
  • **缺点:**每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。


相关文章
|
6月前
|
设计模式 存储 Java
设计模式-工厂模式
设计模式-工厂模式
67 1
|
6月前
|
设计模式
设计模式【二】:工厂模式
设计模式【二】:工厂模式
45 0
|
设计模式 Java
设计模式~工厂模式-03
工厂模式 简单工厂模式 优点: 缺点: 工厂方法模式
53 0
|
设计模式 Java C++
设计模式之工厂模式详解和应用
设计模式之工厂模式详解和应用
65 0
|
6月前
|
设计模式 前端开发 API
【设计模式】之工厂模式
工厂模式是一种常用的创建对象的设计模式,它通过封装对象的创建逻辑,提供统一的接口,实现了代码的解耦和可扩展性。在实际开发中,可以根据具体需求选择是否使用工厂模式来创建对象。工厂模式可以应用于任何需要创建对象的场景。通过使用工厂模式,我们可以提高代码的可维护性、可扩展性和可测试性,使得代码更加灵活和易于理解。
75 0
|
设计模式
设计模式之工厂模式
设计模式之工厂模式
63 0
|
设计模式
【设计模式】工厂模式
【设计模式】工厂模式
|
设计模式 SQL 搜索推荐
设计模式之工厂模式(二)
设计模式之工厂模式
111 0
|
设计模式 消息中间件 Java
一起来学设计模式之工厂模式
前言 目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~ 本节给大家讲一下设计模式中的工厂模式~ 本专题的所有案例代码主要以Java语言为主, 好了, 废话不多说直接开整吧~ 工厂模式 工厂模式是一种常用的设计模式,它提供了一种创建对象的方式,该方式隐藏了对象创建的细节并提供了一个通用的接口,从而使得代码更加灵活和可扩展。在工厂模式中,我们将对象的创建过程封装到一个工厂类中,通过工厂类来创建具体的对象,这样客户端就不需要关心对象的创建过程,只需要调用工厂类提供的接口来获取所需的对象即可。
|
设计模式 Java 测试技术
浅谈设计模式 - 工厂模式(六)
在第一篇里面已经介绍过简单工厂了,但是工厂模式里面不仅仅是简单工厂,还存在工厂方法和抽象工厂,并且从严格意义来讲简单工厂不能算是一种设计模式,本次的文章针对工厂的进化来展开讲一讲工厂模式的三种常见形式:简单工厂、工厂方法、抽象工厂。
69 0