抽象工厂模式

发布时间: 更新时间: 总字数:1053 阅读时间:3m 作者: IP上海 分享 网址

Provide an interface for creating families of related or dependent objecets without specifying their concrete classes.(为创建一组相关或者相互依赖的对象提供一个接口,而且无须指定它们的具体类。)

应用场景

  • 当一个类不知道它所必须创建的对象的类的时候
  • 当一个类希望由它的子类来指定它所创建的对象的时候
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时

抽象工厂模式介绍

抽象工厂模式的通用类图如下所示:

abstract-factory

抽象工厂模式实现

Golang

Java

public interface Food{
    public void createFood();

    //每种吃的都有品牌与种类
    public void getBrand();
}

食物有两种抽象类,一种是糖葫芦,一种是辣条。下面的代码分别是糖葫芦和辣条的实现类:

public abstract class AbstractTanghulu implements Food{
    public void createFood(){
        System.out.println("我是好吃的糖葫芦~");
    }
}
public abstract class AbstractLatiao implements Food{
    public void createFood(){
        System.out.println("我是好吃的辣条~");
    }
}

每个抽象类还有两个实现类,分别是实现公共的细节具体的事情,也就是那些个食物的牌子,下面我就以糖葫芦为例进行实现,辣条的也就是类似了:

public class OldPekingTanghulu extends AbstractTanghulu{
    public void getBrand(){
        System.out.println("老北京糖葫芦~");
    }
}

这个是糖葫芦的具体实现类,显示了它的牌子是老北京的,最有名的糖葫芦~之一了。

public class TianjinTanghulu extends AbstractTanghulu{
    public void getBrand(){
        System.out.println("天津糖葫芦~");
    }
}

好了,有关食物的类已经实现了,接下来就是制造糖葫芦以及辣条的“工厂”的具体实现了首先就是生产糖葫芦和辣条的接口了:

public interface FoodFactory{

    //生产糖葫芦
    public Food createTanghulu();

    //生产辣条
    public Food createLatiao();
}

接下来能否生产真正的糖葫芦以及辣条就看这一步了,首先是生产老北京糖葫芦的实现类:

public class OldPekingFactory implements FoodFactory{
    //生产老北京糖葫芦
    public Food createOldPeking();

}

接下来就是生产天津糖葫芦的实现类(由于比较懒,所以就只实现了糖葫芦的,至于辣条的,你们这么聪明,自然会写的了):

public class TianjinFactory implements FoodFactory{
    //生产天津糖葫芦
    public Food createTianjin();

}

到此就完成了实现,想不想来尝尝两种糖葫芦有什么不同以及哪个比较好吃吗?不用说也知道你们想的,所以就来个测试类来做点糖葫芦来吃,不然作者又要吐槽了,下面的就是测试类,用于生产两种糖葫芦的:

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

        //生产老北京牌的糖葫芦
        FoodFactory peckingFactory = new OldPekingFactory();

        //生产天津牌的糖葫芦
        FoodFactory tianjinFactory = new TianjinFactory();

        Food pekingFood = peckingFactory.createTanghulu();
        Food tianjinFood = tianjinFactory.createTanghulu();

        System.out.println("生产老北京牌的糖葫芦");
        pekingFood.createFood();
        pekingFood.getBrand();

        System.out.println("生产天津牌的糖葫芦");
        tianjinFood.createFood();
        tianjinFood.getBrand();
    }
}

参考书籍:

  • GoF的《Design Patterns:Elements of Reusable Object-Oriented Software》
  • 秦小波的《The Zen of Design Patterns second Edition》
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数