Java设计模式——工厂模式(简单工厂模式、工厂方法模式)

80 阅读3分钟

设计模式诞生的目的,我认为是可以使得写出的代码具有更好的逻辑性,减少了大量冗余代码来进行重复而繁琐的操作,也更好的提升了复用性。所以学习并且能够使用合理的设计模式可以让我们的代码更加美观,优雅,结构更加清晰。

一、简单工厂模式

平时创建对象的时候,一般使用New关键字来进行创建。

ClassAA aa = new ClassAA();
ClassBB bb = new ClassBB();

我们使用New关键字创建对象,会根据括号内的参数在构造函数里对实例化对象进行初始化。

然而,我们创建一个对象的时候,可能需要对他进行一些初始化操作,例如查询数据库,对属性赋值等等。如果我们把这些操作也全部写到构造函数中。那构造函数就变得很长很长,可读性大大降低。

针对这种情况,我们可以引入 ” 工厂 “ 的概念,我们不通过New关键字去创建对象了,我们直接去创建一个工厂,让工厂去帮我们创建对象。

例如,我们创建了一个专门生产手机的工厂,这个工厂可以生产梨子手机,菠萝手机。

那么首先我们要创建小米手机和锤子手机这两个类,这里我实现了一个Phone接口,表明小米手机和锤子手机都是一个 ” Phone “类型的类,然后我们在创建的时候返回Phone类型的就可以了。

public interface Phone {
    void show();
}
 
public class XmPhone implements Phone {
    @Override
    public void show() {
        System.out.println("我是小米手机");
    }
}
 
public class CzPhone implements Phone {
    @Override
    public void show(){
        System.out.println("我是锤子手机");
    }
 
}

在创建个工厂手机,生成手机

public class PhoneFactory{
 
    public Phone createPhone(Integer number) {
        Phone phone = null;
        if(number == 1){
            phone = new XmPhone();
            // .....
        }else if(number == 2){
            phone =  new CzPhone();
            // .....
        }
        return phone;
    }
}

但是会出现一个问题,例如现在又要生成华为手机,就得修改手机工厂,违背了“开闭原则”。如何解决呢,就引到工厂模式

二、工厂方法模式

而工厂方法模式的主要原理就是,我们把每一个要创建的产品对象独立分配一个工厂,提取一个工厂接口出来,独立分配的工厂作为工厂接口的实现类,这样我们在创建工厂——再通过工厂创建对象的过程中,工厂就是唯一确定了的,所以创建的对象也是唯一确定的,不需要再使用过多的判断语句了。

所以我们对之前的工厂类进行修改先.

现在我们提取出了一个工厂接口,接口中有生产手机的方法,然后我们为梨子手机和菠萝手机都创建一个工厂类去实现接口,在实现类的 createPhone 方法中创建手机,这样如果我们以后有了其他手机,只需要再增加手机的工厂类去实现接口就可以了。

public interface PhoneFactory {
    Phone createPhone();
}
public class XmFactory implements PhoneFactory{
    @Override
    public Phone createPhone() {
        Phone phone =  new XmPhone();
        // .....
        return phone;
    }
}
public class CzFactory implements PhoneFactory{
    @Override
    public Phone createPhone() {
        Phone phone =  new CzPhone();
        // .....
        return phone;
    }
}

三、测试

public class Test {
    public static void main(String[] args) {
        PhoneFactory factoryA = new XmFactory();
        PhoneFactory factoryB = new CzFactory();
        Phone phoneA = factoryA.createPhone();
        Phone phoneB = factoryB.createPhone();
        phoneA.show();
        phoneB.show();
    }
}

结果:

我是小米手机

我是锤子手机