设计模式(三):工厂模式

简单工厂模式

1.又叫静态工厂模式,创建型模式,工厂模式的一种。由工厂对象决定创建出哪一种产品类的实例,简单工厂模式是工厂模式家族中最简单实用的模式

2.定义一个创建对象的类,来封装实例化对象的行为

3.实际开发中,大量的创建某种、某类或者某批对象时,就会使用到工厂模式

以牛奶为例:

1.服务端定义了一个产品接口和实现接口的各种牛奶产品类,和一个用于生产牛奶产品的工厂类(静态方法用于生产牛奶产品)

2.客户端调用工厂的静态方法,即可生产牛奶

优点:产品的生产由源码控制,只对用户暴露工厂生产产品的方法(也可以叫接口)

缺点:用户无法扩展生产的产品

工厂方法模式

定义一个创建对象的抽象方法,由子类决定要实例化的类,工厂方法模式将对象的实例化推迟到子类

以牛奶为例:

服务端定义了产品接口和实现接口的各种牛奶产品类,和一个用于生产产品的工厂接口,以及实现工厂接口的各种牛奶产品的生产类

优点:客户端需要扩展一个新产品时,不需要修改作者原来的代码,只是扩展一个新的工厂而已

缺点:客户端仍然依赖于具体产品生产类的类名,如果服务端修改了具体产品的生产类名,客户端也要随之修改,面对产品簇,使用工厂方法设计模式会造成类爆炸

注:

1.针对缺点,产品生产类是对外暴露的接口。作者有责任有义务保证接口名字是稳定的

2.客户端自己扩展产品时,表面看可以不用实现工厂接口,但在服务端开发功能时,往往不仅仅只开发抽象产品、具体产品及对应的工厂,还会配套地搭配一些提前做好的框架。所以客户端扩展产品时,还是要实现工厂接口和创建生产类

抽象工厂模式

定义一个接口,用于创建相关或有依赖关系的对象簇,而无需指明具体的类

抽象工厂模式可由简单工厂模式和工厂方法模式进行整合

工厂抽象成两层,AbsFactory(抽象工厂)和具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类,这样将单个的简单工厂变成了工厂簇,更利于代码的维护和扩展

以牛奶为例:

服务端定义了多个产品接口和实现接口的各种产品类,和一个用于生产各种产品的抽象工厂(工厂簇接口),以及实现抽象工厂的产品簇的生产类

注:

1.抽象工厂中可以生产多个产品,这多个产品之间必须由内在联系

2.同一个工厂中的产品都属于一个产品簇,不能把不同产品簇中的产品混合到一个抽象工厂的实现类中

缺点:当产品等级变化时(增加产品等级,删除产品等级),都要引起以前所有工厂代码的修改,违反了“开闭原则”

结论:当产品等级比较固定时,可以考虑使用抽象工厂;如果产品等级经常变化,则不建议使用抽象工厂

你可能感兴趣的:(设计模式(三):工厂模式)