java 设计模式 -- 建造者模式

1,131 阅读2分钟

工厂模式是创建型设计模式之一,它广泛适用于JDK以及像Spring和Struts框架。

工厂模式被使用在具有多个子类的父类中,根据不同的输入,我们需要返回其中一种的子类。
这种模式将创建类的实例责任从客户端程序交给工行类类负责。
让我们先来学习如何在Java中实现工厂模式,然后我们将了解它的好处,我们会看到它在JDK的使用。


父类

在工厂模式中的超类可以是接口,抽象类或者说一般的类。
在我们的例子中,我们将抽象类作为超类,并且覆盖toString()方法用来达到测试的目的。


SupComputer.java

public abstract class SupComputer{
    public abstract String getRAM();
    public abstract String getHDD();
    public abstract String getCPU();
    @Override
    public String toString() {
    return "RAM= "+this.getRAM()+", HDD="+this.getHDD()+", CPU="+this.getCPU();
    }
}

子类

以下有PC和Server类作为SupComputer子类实现其方法。


SubPC.java

public class SubPC extends SupComputer{
    private String ram;
    private String hdd;
    private String cpu;

    public SubPC(String ram,String hdd,String cpu){
    this.ram  = ram;
    this.hdd = hdd;
    this.cpu = cpu;
    }

    @Override
    public String getRAM() {
    return this.ram;
    }

    @Override
    public String getHDD() {
    return this.hdd;
    }

    @Override
    public String getCPU() {
    return this.cpu;
    }
}

SubServer.java

public class SubServer extends SupComputer{
    private String ram;
    private String hdd;
    private String cpu;

    public SubServer(String ram,String hdd,String cpu){
    this.ram = ram;
    this.hdd = hdd;
    this.cpu = cpu;
    }

    @Override
    public String getRAM() {
    return this.ram;
    }

    @Override
    public String getHDD() {
    return this.hdd;
    }

    @Override
    public String getCPU() {
    return this.cpu;
    }
}

工厂类

现在,我们有超类和子类准备好了,我们可以写我们的工厂类。下面是基本实现。


ComputerFactory.java

public class ComputerFactory {

    public static SupComputer getComputer(String type,String ram,String hdd,String cpu){
        if("PC".equalsIgnoreCase(type)){
            return new SubPC(ram, hdd, cpu);
        }else if("SERVER".equalsIgnoreCase(type)){
            return new SubServer(ram, hdd, cpu);
        }

        return null;

    }
}

下面是上述的工厂模式实现使用一个简单的测试客户端程序。


TestFactory.java

public class TestFactory {
    public static  void main (String args[]){
    SupComputer pc = ComputerFactory.getComputer("pc","2 GB","500 GB","2.4 GHz");
    SupComputer server = ComputerFactory.getComputer("server","16 GB","1 TB","2.9 GHz");
    System.out.println("Factory PC Config::"+pc);
    System.out.println("Factory Server Config::"+server);
    Calendar.getInstance();
    }
}

工厂模式的好处

  1. 工厂模式的方法提供了代码接口,而不是实现。

  2. 工厂模式将删除客户端代码实际实现类的实例,使之更健壮,少耦合和易于扩展。例如,我们可以很容易地改变PC类的实现,因为客户端程序不知道这一点。

  3. 工厂模式通过继承的实现和客户端类之间提供了抽象。


在JDK工厂模式的例子

  1. java.util.Calendar中,资源包和的NumberFormat的getInstance()方法使用工厂模式。

  2. 包装类的valueOf()方法,如布尔,整型等。