Design Pattern: Factory Pattern in Java

Factory pattern helps to generate object by choosing one class from a bunch of classes. The class is chosen by some predefined criteria.

Check complete details and explanations about the Factory pattern in the article: Factory Design Pattern

This article demonstrates Factory pattern implementations in Java. Check the following examples.

Example #1: Transport

Let’s take the example of a transport system. Take a look at the class diagram.

Class Diagram

Transport Factory Interface

// Transport.java

package com.bigboxcode.designpattern.factory.transport;

public interface Transport {
    void start();

    void stop();

    void repair();
}

Bike Class

// Bike.java

package com.bigboxcode.designpattern.factory.transport;

public class Bike implements Transport {
    @Override
    public void start() {
        System.out.println("Bike started");
    }

    @Override
    public void stop() {
        System.out.println("Bike Stopped");
    }

    @Override
    public void repair() {
        System.out.println("Bike Repair");
    }
}

Car Class

// Car.java

package com.bigboxcode.designpattern.factory.transport;

public class Car implements Transport {
    @Override
    public void start() {
        System.out.println("Car started");
    }

    @Override
    public void stop() {
        System.out.println("Car Stopped");
    }

    @Override
    public void repair() {
        System.out.println("Car Repair");
    }
}

Plane Class

// Plane.java

package com.bigboxcode.designpattern.factory.transport;

public class Plane implements Transport {
    @Override
    public void start() {
        System.out.println("Plane started");
    }

    @Override
    public void stop() {
        System.out.println("Plane Stopped");
    }

    @Override
    public void repair() {
        System.out.println("Plane Repair");
    }
}

Transport Factory Class

// TransportFactory.java

package com.bigboxcode.designpattern.factory.transport;

public class TransportFactory {
    public Transport getTransport(String type) {
        if (type == null) {
            return null;
        }

        if (type.equalsIgnoreCase("bike")) {
            return new Bike();
        }

        if (type.equalsIgnoreCase("car")) {
            return new Car();
        }

        if (type.equalsIgnoreCase("plane")) {
            return new Plane();
        }

        return null;
    }
}

Demo

// Demo.java

package com.bigboxcode.designpattern.factory.transport;

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

        TransportFactory transportFactory = new TransportFactory();

        Transport transport1 = transportFactory.getTransport("bike");
        transport1.start();

        Transport transport2 = transportFactory.getTransport("car");
        transport2.start();

        Transport transport3 = transportFactory.getTransport("plane");
        transport3.start();

    }
}

Output

Bike started
Car started
Plane started

Example #2: Transport [Factory Method]

Transport Interface

// Transport.java

package com.bigboxcode.designpattern.factory.transportmethod;

public interface Transport {
    void start();

    void stop();

    void repair();
}

Bus Concrete Item Class

// Bus.java

package com.bigboxcode.designpattern.factory.transportmethod;

public class Bus implements Transport {
    @Override
    public void start() {
        System.out.println("Bus started");
    }

    @Override
    public void stop() {
        System.out.println("Bus Stopped");
    }

    @Override
    public void repair() {
        System.out.println("Bus Repair");
    }
}

Bike Concrete Item Class

// Bike.java

package com.bigboxcode.designpattern.factory.transportmethod;

public class Bike implements Transport {
    @Override
    public void start() {
        System.out.println("Bike started");
    }

    @Override
    public void stop() {
        System.out.println("Bike Stopped");
    }

    @Override
    public void repair() {
        System.out.println("Bike Repair");
    }
}

Car Concrete Item Class

// Car.java

package com.bigboxcode.designpattern.factory.transportmethod;

public class Car implements Transport {
    @Override
    public void start() {
        System.out.println("Car started");
    }

    @Override
    public void stop() {
        System.out.println("Car Stopped");
    }

    @Override
    public void repair() {
        System.out.println("Car Repair");
    }
}

Plane Concreate Item Class

// Plane.java

package com.bigboxcode.designpattern.factory.transportmethod;

public class Plane implements Transport {
    @Override
    public void start() {
        System.out.println("Plane started");
    }

    @Override
    public void stop() {
        System.out.println("Plane Stopped");
    }

    @Override
    public void repair() {
        System.out.println("Plane Repair");
    }
}

Helicopter Concrete Item Class

// Helicopter.java

package com.bigboxcode.designpattern.factory.transportmethod;

public class Helicopter implements Transport {
        @Override
        public void start() {
            System.out.println("Helicopter started");
        }

        @Override
        public void stop() {
            System.out.println("Helicopter Stopped");
        }

        @Override
        public void repair() {
            System.out.println("Helicopter Repair");
        }
}

Transport Factory Abstract Class

// TransportFactory.java

package com.bigboxcode.designpattern.factory.transportmethod;

public abstract class TransportFactory {
    public void operateTransport(String name) {
        Transport transport = getTransport(name);

        transport.start();
        transport.stop();
    }

    public void repairTransport(String name) {
        Transport transport = getTransport(name);

        transport.repair();
    }

    public abstract Transport getTransport(String name);
}

Road Transport Factory

// RoadTransportFactory.java

package com.bigboxcode.designpattern.factory.transportmethod;

public class RoadTransportFactory extends TransportFactory {
    @Override
    public Transport getTransport(String name) {
        if (name.equalsIgnoreCase("car")) {
            return new Car();
        }

        if (name.equalsIgnoreCase("bike")) {
            return new Bike();
        }

        if (name.equalsIgnoreCase("bus")) {
            return new Bus();
        }

        return null;
    }
}

Air Transport Factory

// AirTransportFactory.java

package com.bigboxcode.designpattern.factory.transportmethod;

public class AirTransportFactory extends TransportFactory {
    @Override
    public Transport getTransport(String name) {
        if (name.equalsIgnoreCase("plane")) {
            return new Plane();
        }

        if (name.equalsIgnoreCase("helicopter")) {
            return new Helicopter();
        }

        return null;
    }
}

Demo

// Demo.java

package com.bigboxcode.designpattern.factory.transportmethod;

public class Demo {
    public static void main(String[] args) {
        TransportFactory roadTransportFactory = new RoadTransportFactory();
        TransportFactory airTransportFactory = new AirTransportFactory();

        roadTransportFactory.operateTransport("bus");

        System.out.println("---------------------------------------");

        airTransportFactory.operateTransport("helicopter");

        System.out.println("---------------------------------------");

        roadTransportFactory.repairTransport("bike");
    }
}

Output

Bus started
Bus Stopped
---------------------------------------
Helicopter started
Helicopter Stopped
---------------------------------------
Bike Repair

Source Code

Use the following link to get the source code:

Leave a Comment