6月更文挑战|设计模式 —— 抽象工厂方法模式

220 阅读3分钟

这是我参与更文挑战的第6天,活动详情查看:更文挑战

抽象工厂方法模式

之前了解了工厂方法模式,那么抽象工厂方法模式又是怎样一种模式?抽象工厂的定义是为创建一组相关或者相互依赖的对象提供一个接口,不需要指定具体类。可以理解抽象工厂方法模式是工厂方法模式升级版,工厂方法模式只能生产一个等级产品,抽象工厂方法模式可以生产多个等级产品。

抽象工厂方法模式在类结构上其实和工厂方法模式一样包含4类:

  1. 抽象工厂:声明一组创建一种产品方法,每个方法对应一种产品。
  2. 具体工厂:实现抽象工厂定义的产品方法,构成一个产品种类。
  3. 抽象产品:抽象产品,声明了每种产品接口。
  4. 具体产品:具体产品,定义具体工厂生产的具体产品对象。 不同之处在于抽象工厂方法模式中抽象工厂方法更多,抽象产品更多。另外抽象工厂方法模式满足以下条件:具有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品;只消费其中一个某一族产品、同族产品一起使用。
// 电脑产品抽象类
public abstart class Computer{
    public abstract void bootUp();
}

// Dell系列电脑产品
public class Dell extends Computer{
    @Override
    public void bootUp(){
        ....
    }
}
// Asus系列电脑产品
public class Asus extends Computer{
    @Override
    public void bootUp(){
        ....
    }
}
// 内存抽象类
public abstart class Raw{
    public abstract void run();
}
// Dell内存产品
public class DellRaw extends Raw{
    @Override
    public void run(){
        ....
    }
}
// Asus内存产品
public class AsusRaw extends Raw{
    @Override
    public void run(){
        ....
    }
}
// CPU抽象类
public abstart class CPU{
    public abstract void run();
}
// Intel产品
public class Intel extends CPU{
    @Override
    public void run(){
        ....
    }
}
// AMD产品
public class AMD extends CPU{
    @Override
    public void run(){
        ....
    }
}
// 抽像工厂 可生产电脑、CPU、内存
public abstart class ComputerFactory{
    public abstract Computer createComputer();
    public abstract CPU createCPU();
    public abstract Raw createRaw();
}

// Asus工厂 可生产Asus系列产品
public AsusFactory extends ComputerFactory{
    @Override
    public Computer createComputer(){
        Asus asus = new Asus();
        return asus;
    } 
    
    @Override
    public CPU createCPU(){
        return new AMD();
    } 
    
    @Override
    public Raw createRaw(){
        return new AsusRaw();
    }  
}
// Dell工厂 可生产Dell系列产品
public DellFactory extends ComputerFactory{
    @Override
    public Computer createComputer(){
        return new Dell();
    }
    @Override
    public CPU createCPU(){
        return new Intel();
    } 
    
    @Override
    public Raw createRaw(){
        return new DellRaw();
    }
}

以上代码就是抽象工厂所具备的特性,如果有一天工厂成为合资工厂,专门生产组装机,CPU采用Intell、电脑是Asus、Raw是Asus。这种情况当然是被允许的,可以创建新工厂组装希望生产的产品。

总结

抽象工厂方法模式具备工厂方法模式的特点外,还具备以下优点: 1.抽象工厂方法模式在新建新类型的新产品才会创建新工厂,工厂方法模式只能生产一种产品,抽象工厂方法模式可创建一类型多种具体产品。 2.增强了程序可扩展性,新增新产品族,不需要修改源代码。

但缺点是当产品族中新增一种新产品时,所有已存在子工厂类都需要修改,实现实例化新产品方法,从而增加了系统的抽象性和理解难度。因此在开始使用抽象工厂方法模式之前就需要谨慎设计原产品形态,避免后期无端新增新产品的可能性。

参考