抽象工厂
定义
抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,无须指定他们具体的类
类型:创建型
适用场景
客户端不依赖于同一产品实例如何被创建、实现等细节
强调一些列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复代码
提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现
产品等级机构与产品族概念
为了更清晰地理解工厂方法模式,需要先引入两个概念:
产品等级结构 :产品等级结构即产品的继承结构,如一个抽象类是漫画,其子类有快看漫画、其他漫画,则抽象漫画与具体品牌的漫画之间构成了一个产品等级结构,抽象漫画是父类,而具体品牌的漫画是其子类。
产品族 :在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如快看漫画公司发版的漫画、快看公司投资的电影,快看的漫画位于漫画产品等级结构中,快看的电影就位于电影等级结构中
与工厂方法模式区别
工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构
优缺点
优点:具体产品在应用蹭代码隔离,无须关心具体创建细节
将一个系列的产品族统一到一起创建
缺点:规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口
增加了系统的抽象性和理解难度
实例
某些公司既生产漫画又投资电影,在产品等级上属于漫画等级和电影等级
public abstract class ComicBook {
abstract void produceComic();
}
public abstract class Movie {
abstract void produceMoive();
}
有些公司比如快看公司既生产漫画又投资电影,然后还有其他公司也是这样
public class KKComicBook extends ComicBook {
@Override
void produceComic() {
System.out.println("发版快看漫画");
}
}
public class KKMovie extends Movie{
@Override
void produceMoive() {
System.out.println("生产快看电影");
}
}
其他公司
public class OtherComicBook extends ComicBook{
@Override
void produceComic() {
System.out.println("发版其他漫画");
}
}
public class OtherMovie extends Movie{
@Override
void produceMoive() {
System.out.println("生产其他电影");
}
}
工厂类
public abstract class Factory {
void produceMoview() {
}
void produceComicBook(){
}
}
快看工厂
public class KKWorldFactory extends Factory{
@Override
void produceComicBook() {
new KKComicBook().produceComic();
}
@Override
void produceMoview() {
new KKMovie().produceMoive();
}
}
其他工厂
public class OtherFactory extends Factory {
@Override
void produceComicBook() {
new OtherComicBook().produceComic();
}
@Override
void produceMoview() {
new OtherMovie().produceMoive();
}
}
测试类:
public class Test {
public static void main(String[] args) {
KKWorldFactory kkWorldFactory=new KKWorldFactory();
kkWorldFactory.produceComicBook();
kkWorldFactory.produceMoview();
}
}
输出:
发版快看漫画
生产快看电影