【创建型设计模式】工厂模式

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 【创建型设计模式】工厂模式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

一、基本概念

作用:实现创建者和调用者分离

核心本质:实例化对象不使用new,用工厂方法代替
将选择实现类,创建对象统一管理和控制,从而将调用者和实现类解耦

二、三种工厂模式

1、简单工厂

简单工厂也叫静态工厂模式,一般是使用静态方法,通过接受不同的参数来返回不同的实例

缺点:对增加新的产品无能为力,只能通过修改已有的类或者已有的方法来进行扩展,例如下面如果新增一个保时捷,那么我们的CarFactory类就要修改原有代码了,不符合开闭原则,所以我们后面使用工厂方法模式规避此问题

开闭原则指的是软件实体应该通过扩展(例如新增类)来实现变化,而不是修改已有的代码(修改已有的方法或者类)

public interface Car {
    void showName();
}

public class Byd implements Car{
    @Override
    public void showName() {
        System.out.println("比亚迪车");
    }
}

public class Audi implements Car{
    @Override
    public void showName() {
        System.out.println("奥迪车");
    }
}

// 简单工厂模式
public class CarFactory {
    // 使用静态方法,通过接受不同的参数来返回不同的实例
    public static Car createCar(String name) {
        if ("比亚迪".equals(name)) {
           return new Byd();
        } else if ("奥迪".equals(name)) {
            return new Audi();
        } else {
            return null;
        }
    }
}

// 这种也是简单工厂模式的体现
public class CarFactory02 {
    public static Car createByd() {
        return new Byd();
    }
     public static Car createAudi() {
        return new Audi();
    }
}


// 简单工厂情况下,获取对象实例
public class Client {
    public static void main(String[] args) {
        // 通过调用工厂类来获取对象实例
        Car c1 = CarFactory.createCar("奥迪");
        Car c2 = CarFactory.createCar("比亚迪");

        c1.showName();
        c2.showName();
    }
}

2、工厂方法模式

工厂方法模式和简单工厂模式最大的不同:
简单工厂模式只有一个工厂类,而工厂方法模式有一组实现了相同接口的工厂类

public interface Car {
    void showName();
}

public class Byd implements Car{
    @Override
    public void showName() {
        System.out.println("比亚迪车");
    }
}

public class Audi implements Car{
    @Override
    public void showName() {
        System.out.println("奥迪车");
    }
}

public interface CarFactory {
    Car createCar();
}

//返回奥迪类实例
public class AudiFactory implements CarFactory{
    @Override
    public Car createCar() {
        return new Audi();
    }
}

//返回比亚迪类实例
public class BydFactory implements CarFactory{
    @Override
    public Car createCar() {
        return new Byd();
    }
}

// 测试类
public class Client {
    public static void main(String[] args) {
        Car c1 = new AudiFactory().createCar();
        Car c2 = new BydFactory().createCar();

        c1.showName();
        c2.showName();
    }
}

3、抽象工厂模式

抽象工厂模式(Abstract Factory Pattern):
是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂,重点理解什么是产品族

产品等级结构:即产品的继承结构,如一个抽象类是轮胎,其子类有高端轮胎和低端轮胎,则轮胎与具体级别的轮胎之间构成了一个产品等级结构

产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,例如下面例子中高端车工厂生产的轮胎、引擎和座椅就可以看成一个产品族

举个例子,我们有一个超级汽车工厂,这个工厂高端车和低端车都生产

为了方便管理,我们需要造出两个子工厂,专门负责生产高端车和低端车

public interface CarFactory {
    Engine createEngine();

    Seat createSeat();

    Tire createTire();
}

public class LowerFactory implements CarFactory{
    @Override
    public Engine createEngine() {
        return new LowerEngine();
    }

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

    @Override
    public Tire createTire() {
        return new LowerTire();
    }
}

public class AdvancedFactory implements CarFactory{
    @Override
    public Engine createEngine() {
        return new AdvancedEngine();
    }

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

    @Override
    public Tire createTire() {
        return new AdvancedTire();
    }
}

子工厂又有专门生产座椅、引擎和轮胎的二级工厂

public interface Engine {
    void engineInfo();
}

class AdvancedEngine implements  Engine {
    @Override
    public void engineInfo() {
        System.out.println("高端引擎");
    }
}

class LowerEngine implements Engine {
    @Override
    public void engineInfo() {
        System.out.println("低端引擎");
    }
}
===============================================
public interface Seat {
    void seatInfo();
}

class AdvancedSeat implements Seat {
    @Override
    public void seatInfo() {
        System.out.println("高端座椅");
    }
}

class LowerSeat implements  Seat {
    @Override
    public void seatInfo() {
        System.out.println("低端座椅");
    }
}
===============================================
public interface Tire {
    void tireInfo();
}

class AdvancedTire implements Tire {
    @Override
    public void tireInfo() {
        System.out.println("高端轮胎");
    }
}

class LowerTire implements  Tire {
    @Override
    public void tireInfo() {
        System.out.println("低端轮胎");
    }
}

超级工厂只需要调用相应子工厂就可以生产高端车和低端车了

public class Client {
    public static void main(String[] args) {
        CarFactory carFactory = new AdvancedFactory();
        Engine engine = carFactory.createEngine();
        engine.engineInfo();
    }
}

如有错误,欢迎指正!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136819.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!