设计模式——抽象工厂

抽象工厂

定义

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,无须指定他们具体的类

类型:创建型

适用场景

客户端不依赖于同一产品实例如何被创建、实现等细节
强调一些列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复代码
提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现

产品等级机构与产品族概念

为了更清晰地理解工厂方法模式,需要先引入两个概念:

产品等级结构 :产品等级结构即产品的继承结构,如一个抽象类是漫画,其子类有快看漫画、其他漫画,则抽象漫画与具体品牌的漫画之间构成了一个产品等级结构,抽象漫画是父类,而具体品牌的漫画是其子类。
产品族 :在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如快看漫画公司发版的漫画、快看公司投资的电影,快看的漫画位于漫画产品等级结构中,快看的电影就位于电影等级结构中

与工厂方法模式区别

工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构

优缺点

优点:具体产品在应用蹭代码隔离,无须关心具体创建细节
将一个系列的产品族统一到一起创建
缺点:规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口
增加了系统的抽象性和理解难度

实例

某些公司既生产漫画又投资电影,在产品等级上属于漫画等级和电影等级

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();
    }
}

输出:


发版快看漫画
生产快看电影
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值