工厂模式

工厂模式

概述

在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型。

使用场景

假设一家汽车制造公司,一直在使用一套程序生产比亚迪型号的汽车,现在出现了大批量的特斯拉汽车的订单,如果在原来的程序上进行修改的话就会违反开闭原则,同时如果后期又多了其他品牌的订单,则再原程序上修改显得不现实。

解决方法

该公司分开出来两个制造工厂,BYDFactory和TeslaFactory,去分别制造该类型的汽车。公司接到订单后,只需要派给不同的公司即可。

实现

// 抽象工厂类接口
public interface CarFactory {
    public Car produce();
}

// 抽象产品类接口
// public interface Car {
    String show();
}

// 特斯拉工厂
public class TeslaFactory implements CarFactory{
    @Override
    public Car produce() {
    		// 只生产特斯拉
        return new TeslaCar();
    }
}

// 比亚迪工厂
public class BYDFactory implements CarFactory{
    @Override
    public Car produce() {
    		// 只生产比亚迪
        return new BYDCar();
    }
}

// 比亚迪汽车
public class BYDCar implements Car{
    @Override
    public String show() {
        return "Build Your Dream";
    }
}

// 特斯拉汽车
public class TeslaCar implements Car{
    @Override
    public String show() {
        return "Go Electric";
    }
}

// 制造汽车
public class Client {
    public static void main(String[] args) {
        // 不关心创建过程,只关心调用者是谁
        Car car = new BYDFactory().produce();
        String show = car.show();
        System.out.println(show);
    }
}

总结

  1. 需要有抽象工厂类和抽象产品类,工厂类生产各自的产品。
  2. 遵循开闭原则,不会对原程序进行修改。
  3. 单一功能指责,每个工厂的职责互不影响,比如特斯拉制造的四驱系统,比亚迪制造后驱系统。
  4. 缺点就是可能随着品牌增多,导致具体工厂类和具体产品类数量变多。

抽象工厂模式

概述

能创建一系列相关对象,而不需要制定具体类。

使用场景

电脑组装厂要组装联想和戴尔品牌的电脑,两种品牌的电脑采用的CPU、内存、硬盘都是不一样的厂家,如果不区分使用一套程序去制造非常困难,而且后期CPU换了型号,还要对应用程序大动手脚。

解决方法

应当采用抽象工厂模式,抽象出一条整链的原材料,如果后期修改的话对于上一层调用的地方不用修改,只需要修改具体工厂的方法。比如联想将CPU换为AMD只需要修改联想厂家的方法。

实现

// 抽象工厂
public interface ComputerFactory {
    CPU createCpu();

    Memory createMemory();
}

// 抽象产品
public interface CPU {
    void work();
}

public interface Memory {
    default void work() {
        System.out.println("默认内存");
    }
}

// 具体产品
public class IntelCpu implements CPU{
    @Override
    public void work() {
        System.out.println("intel CPU");
    }
}

public class AppleCpu implements CPU{
    @Override
    public void work() {
        System.out.println("apple cpu");
    }
}

// 具体工厂
public class DellFactory implements ComputerFactory {
		// apple cpu
    @Override
    public CPU createCpu() {
        return new AppleCpu();
    }

    @Override
    public Memory createMemory() {
        return new Memory() {
        };
    }
}


public class LenovoFactory implements ComputerFactory {
		// intel cpu
    @Override
    public CPU createCpu() {
        return new IntelCpu();
    }

    @Override
    public Memory createMemory() {
        return new Memory() {
        };
    }
}


public class Client {
    public static void main(String[] args) {
    		// 抽象工厂可以生产不同具体类一系列产品
        DellFactory factory = new DellFactory();
        factory.createCpu().work();
        factory.createMemory().work();
    }
}

总结

  1. 与普通工厂模式的区别就是每一个工厂不是创建单个对象,而是创建多个对象。
原文地址:https://www.cnblogs.com/jimmyhe/p/15063605.html