设计模式篇|工厂模式

2019-08-13  本文已影响0人  青年心路
1.工厂模式简介

实现了创建者和调用者的分离。其核心本质是用工厂方法代替new操作,将选择实现类、创建对象统一管理和控制,从而将调用者和实现类解耦

详细分类
2.面向对象设计的基本原则
3.简单工厂模式实现
public interface Car {

    void run();
}

public class Audi implements Car {

    @Override
    public void run() {
        System.out.println("奥迪在跑!");
    }
}

Benz.java

public class Benz implements Car {
    @Override
    public void run() {
        System.out.println("奔驰在跑!");
    }
}
public class CarFactory {

    public static Car createCar(String type){
        if ("奥迪".equals(type)){
            return new Audi();
        }else if ("奔驰".equals(type)){
            return new Benz();
        }else{
            return null;
        }
    }
}
public class Test02 {

    public static void main(String[] args) {

        Car car1 = CarFactory.createCar("奥迪");
        Car car2 = CarFactory.createCar("奔驰");

        if (car1 != null){
            car1.run();
        }
        if (car2 != null){
            car2.run();
        }

    }
}

运行结果


image.png
简单工厂模式总结

优点:
实现简单,外部只需传入名字即可获取对象,方便了调用者。

缺点:
简单工厂模式无法添加新的功能,如果添加新功能则违反了面向对象设计原则中的开闭原则。

4.工厂方法模式
public interface Car {

    void run();
}
public class Audi implements Car {

    @Override
    public void run() {
        System.out.println("奥迪在跑!");
    }
}
public class Benz implements Car {
    @Override
    public void run() {
        System.out.println("奔驰在跑!");
    }
}
public interface CarFactory {

    Car createCar();
}
public class AudiFactory implements CarFactory {

    @Override
    public Car createCar() {
        return new Audi();
    }
}
public class BenzFactory implements CarFactory {

    @Override
    public Car createCar() {
        return new Benz();
    }
}
public class Client {

    public static void main(String[] args) {
        Car c1 = new AudiFactory().createCar();
        Car c2 = new BenzFactory().createCar();

        c1.run();
        c2.run();
    }
}

运行结果:


image.png

工厂方法模式总结
优点:
易于扩展,添加新功能只需创建新的实体类以及实现类即可。符合开闭原则。
缺点:
接口与类的数量急剧增大

5.抽象工厂模式

抽象工厂模式主要用于生产产品族,下面我们使用汽车的生产为例

下列代码编写会有些违反规范,主要用作示例

public interface Engine {

    //跑
    void run();

    //启动
    void start();
}

class LuxuryEngine implements Engine{

    @Override
    public void run() {
        System.out.println("转得快!");
    }

    @Override
    public void start() {
        System.out.println("启动快,可以自动启停!");
    }
}


class LowEngine implements Engine{

    @Override
    public void run() {
        System.out.println("转的慢!");
    }

    @Override
    public void start() {
        System.out.println("启动慢!");
    }
}
public interface Seat {

    //按摩
    void massage();
}

class LuxurySeat implements Seat{

    @Override
    public void massage() {
        System.out.println("可以按摩");
    }
}

class LowSeat implements Seat{

    @Override
    public void massage() {
        System.out.println("不能按摩");
    }
}
public interface Tyre {

    //旋转
    void revolve();
}

class LuxuryTyre implements Tyre{

    @Override
    public void revolve() {
        System.out.println("磨损慢");
    }
}

class LowTyre implements Tyre{

    @Override
    public void revolve() {
        System.out.println("磨损快");
    }
}
public interface CarFactory {

    Engine createEngine();

    Seat createSeat();

    Tyre createTyre();
}
public class LuxuryCarFactory implements CarFactory {

    @Override
    public Engine createEngine() {
        return new LuxuryEngine();
    }

    @Override
    public Seat createSeat() {
        return new LuxurySeat();
    }

    @Override
    public Tyre createTyre() {
        return new LuxuryTyre();
    }
}
public class LowCarFactory implements CarFactory {
    @Override
    public Engine createEngine() {
        return new LowEngine();
    }

    @Override
    public Seat createSeat() {
        return new LowSeat();
    }

    @Override
    public Tyre createTyre() {
        return new LowTyre();
    }
}
public class Client {

    public static void main(String[] args) {

        //创建高端汽车
        CarFactory factory = new LuxuryCarFactory();
        Engine engine = factory.createEngine();
        Seat seat = factory.createSeat();
        Tyre tyre = factory.createTyre();

        engine.run();
        engine.start();

        seat.massage();

        tyre.revolve();
    }
}

运行效果图


image.png
上一篇 下一篇

猜你喜欢

热点阅读