Java设计模式之创建型模式-工厂模式(Factory)

工厂模式又叫多态性工厂模式。在讲工厂模式之前,先简单讲下工厂模式的一个特殊实现–简单工厂模式,也叫做静态工厂方法模式,其不属于23种GOF设计模式之一。


简单工厂模式:一个工厂方法,依据传入的不同参数,生成对应的具体实例化对象。


简单工厂模式的实现

  我这里以选择手机打电话为例。
  1.创建一个Phone接口(抽象类/普通java类)

public interface Phone {    
    void call();
}

  2.创建实现接口的两个实体类IPhone、MiPhone

public class IPhone implements Phone {
    public void call() {
        System.out.println("IPhone call...");
    }
}
public class MiPhone implements Phone {
    public void call() {
        System.out.println("MiPhone call...");
    }
}

  3.创建一个工厂类,依据传入的参数,生成对应的实体类对象

public class PhoneFactory {
    public static Phone getPhone(String type) {
        if ("iphone".equalsIgnoreCase(type)) {
            return new IPhone();
        } else if ("miphone".equalsIgnoreCase(type)) {
            return new MiPhone();
        }
        return null;
    }
}

  4.工厂测试类

public class FactoryTest {
    public static void main(String[] args) {
        Phone phone = PhoneFactory.getPhone("iphone");
        if (phone != null) {
            phone.call();
        } else {
            System.out.println("无此手机类型...");
        }
    }
}

输出的结果:IPhone call...

通过上述实例,我们可以看到:
  1.客户端不用去关心实体类对象创建的具体过程,达到了解耦的效果
  2.工厂类可以根绝客户端输入的条件动态的去实例化对应的类

  上述模式的程序还是可扩展的,比如我们要使用华为手机打电话,怎么做?
  我们只需要创建一个新的实体类HuaweiPhone,同时实现IPhone这个接口,然后再在工厂类当中增加一个关于创建HuaweiPhone实例的判断分支。

else if ("huaweiphone".equalsIgnoreCase(type)) {
    return new HuaweiPhone();
}

  那么问题来了,增加如上的判断分支修改了我们原有的工厂类。换句话说,我们不仅对扩展开放了,而且对修改也开放了,这就有违设计模式六大原则中的开闭原则。
  那么,怎么解决这个问题?这就要来看看工厂方法模式了。


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


工厂模式的实现

  我这里还是以上述例子为例。 
  1.创建一个Phone接口(抽象类/普通java类)

public interface Phone {    
    void call();
}

  2.创建实现接口的两个实体类IPhone、MiPhone

public class IPhone implements Phone {
    public void call() {
        System.out.println("IPhone call...");
    }
}
public class MiPhone implements Phone {
    public void call() {
        System.out.println("MiPhone call...");
    }
}

  3.创建一个抽象工厂接口

public interface PhoneFactory {
    Phone getPhone();
}

  4.创建对应实体类的工厂类,并实现抽象工厂接口

public class IPhoneFactory implements PhoneFactory {
    public Phone getPhone() {
        return new IPhone();
    }
}
public class MiPhoneFactory implements PhoneFactory {
    public Phone getPhone() {
        return new MiPhone();
    }
}

  5.工厂测试类

public class FactoryTest {
    public static void main(String[] args) {
        PhoneFactory pf = new IPhoneFactory();
        Phone p = pf.getPhone();
        p.call();
    }
}

输出的结果:IPhone call...

  通过工厂模式的实例可以发现,当需要新增加产品时,我们只需要增加一个对应的实体类和对应创建实体类的工厂。比如上述增加华为手机的例子,我们只需创建一个新的实体类HuaweiPhone实现IPhone接口,再新建一个新的工厂类HuaweiPhoneFactory实现PhoneFactory接口即可。而不用再对原本的工厂类进行修改,很好的符合开闭原则。

注:关于两者的使用情况
  简单工厂模式:
    工厂类负责创建的对象比较少
    客户端只关心传入的参数,不关心内部具体实现
  工厂模式:
    需要大量创建不同的对象,且这些对象的实体类具有共同接口

你可能感兴趣的:(设计模式)