WX搜寻:程序员个人修养 订阅最新内容
定义
形象工厂模式提供一个接口,用于创立相干或依赖对象的家族,而不须要明确指定具体类
首先,咱们来了解下产品族的概念。
咱们还是以咖啡厅为例,咱们晓得,社会上不只有星巴克咖啡一个品牌,还有咱们国产的瑞幸咖啡、上岛咖啡、咖啡之翼等。而这每种品牌下,都会提供拿铁、摩卡、卡布奇诺等不同口味的咖啡。
产品族就可以看做是同一品牌下的同不同口味的咖啡,比方:星巴克品牌的拿铁咖啡、摩卡咖啡和卡布奇诺咖啡称为一个产品族。同样,瑞幸咖啡和咖啡之翼又代表了另外的产品族。
形象工厂的实用于这种须要生成产品族的情景。形象产品类外部提供了多个其余形象产品,形象工厂类定义了产品的创立接口,通过具体的工厂子类,就能够生产出相应的产品族对象。
类图
形象工厂模式次要蕴含四个角色:
- 形象工厂:申明创立形象产品对象的一个操作接口;
- 具体工厂:实现创立具体产品对象的操作;
- 形象产品:为一类产品对象申明一个接口;
- 具体产品:定义一个将被相应的具体工厂创立的产品对象;
代码实现
package com.study.design.Factory.abstractfactory;/** * 形象产品 * 拿铁咖啡 */public interface Latte { void coffeName();}
package com.study.design.Factory.abstractfactory;/** * 形象产品 * 拿铁咖啡 */public interface Mocha { void coffeName();}
package com.study.design.Factory.abstractfactory;/** * 产品族中的一个具体产品:拿铁咖啡 * 产品组族:瑞幸咖啡 */public class RuiXingLatte implements Latte{ @Override public void coffeName() { System.out.println("I got a RuiXingLatte"); }}
package com.study.design.Factory.abstractfactory;/** * 产品族中的一个具体产品:摩卡咖啡 * 产品组族:瑞幸咖啡 */public class RuiXingMocha implements Mocha{ @Override public void coffeName() { System.out.println("I got a RuiXingMocha"); }}
package com.study.design.Factory.abstractfactory;/** * 产品族中的一个具体产品:摩卡咖啡 * 产品组族:星巴克 */public class StarbuckeMocha implements Mocha{ @Override public void coffeName() { System.out.println("I got a StarbuckeMocha"); }}
package com.study.design.Factory.abstractfactory;/** * 产品族中的一个具体产品:拿铁咖啡 * 产品组族:星巴克 */public class StarbucksLatte implements Latte{ @Override public void coffeName() { System.out.println("I got a StarbucksLatte"); }}
package com.study.design.Factory.abstractfactory;import sun.misc.GC;/** * 产品族中的一个具体产品:拿铁咖啡 * 产品组族:咖啡之翼 */public class WingCoffeLatte implements Latte { @Override public void coffeName() { System.out.println("I got a WingCoffeLatte"); }}
package com.study.design.Factory.abstractfactory;/** * 产品族中的一个具体产品:摩卡咖啡 * 产品组族:咖啡之翼 */public class WingCoffeMocha implements Mocha{ @Override public void coffeName() { System.out.println("I got a WingCoffeMocha"); }}
package com.study.design.Factory.abstractfactory;/** * 形象工厂 * 咖啡厅接口 */public interface CoffeShop { // 制作拿铁咖啡 Latte makeLate(); // 制作摩卡咖啡 Mocha makeMocha();}
package com.study.design.Factory.abstractfactory;/** * 具体工厂 * 瑞幸咖啡厅 */public class RuiXingCoffeShop implements CoffeShop{ @Override public Latte makeLate() { return new RuiXingLatte(); } @Override public Mocha makeMocha() { return new RuiXingMocha(); }}
package com.study.design.Factory.abstractfactory;/** * 具体工厂 * 星巴克咖啡厅 */public class StarbucksShop implements CoffeShop{ @Override public Latte makeLate() { return new StarbucksLatte(); } @Override public Mocha makeMocha() { return new StarbuckeMocha(); }}
package com.study.design.Factory.abstractfactory;/** * 具体工厂 * 咖啡之翼咖啡厅 */public class WingCoffeCoffeShop implements CoffeShop{ @Override public Latte makeLate() { return new WingCoffeLatte(); } @Override public Mocha makeMocha() { return new WingCoffeMocha(); }}
package com.study.design.Factory.abstractfactory;public class AbstractFactoryTest { public static void main(String[] args) { // 产品组族:瑞幸咖啡厅 CoffeShop coffeShop = new RuiXingCoffeShop(); Latte latte = coffeShop.makeLate(); latte.coffeName(); Mocha mocha = coffeShop.makeMocha(); mocha.coffeName(); // 产品组族:星巴克咖啡厅 coffeShop = new StarbucksShop(); latte = coffeShop.makeLate(); latte.coffeName(); mocha = coffeShop.makeMocha(); mocha.coffeName(); // 产品组族:咖啡之翼咖啡厅 coffeShop = new WingCoffeCoffeShop(); latte = coffeShop.makeLate(); latte.coffeName(); mocha = coffeShop.makeMocha(); mocha.coffeName(); }}
三种工厂模式比照
简略工厂模式
简略工厂模式(又叫作动态工厂办法模式)有一个具体的工厂类,能够生成多个不同的产品,属于创立型设计模式。简略工厂模式不在 GoF 23种设计模式之列。
对于产品种类较少的状况,思考应用简略工厂模式能够很不便的创立所需对象。应用简略工厂模式的客户端只须要传入相应的参数,不须要关怀创建对象的逻辑。
简略工厂模式的构造简略,调用不便。对于外界给定的信息,能够很不便地创立出相应的产品。工厂和产品的职责辨别明确。然而繁多工厂类负责所有产品的创立,当产品数量增多时,工厂类代码会十分臃肿,违反高聚合准则。
工厂办法模式
在工厂办法模式中,不再由繁多工厂类生产产品,而是由工厂类的子类实现具体产品的创立。因而,当减少一个产品时,只须要减少一个相应的工厂类子类即可,解决了简略工厂中代码臃肿的问题,也合乎开闭准则。
灵活性加强,对于新产品的创立,只须要写一个相应的工厂类。典型的解耦框架,高层模块只须要晓得产品的抽象类,无需关怀其余实现类。
然而类的个数容易过多,减少复杂度,也减少了零碎的抽象性和了解难度。对于形象产品只能生产一种产品的问题,能够通过形象工厂模式解决。
形象工厂模式
当须要产品族时,形象工厂能够保障客户端始终只应用同一个产品的产品族。加强了程序的可扩展性,对于新产品族的减少,只须要实现一个新的具体工厂即可,合乎开闭准则。然而在产品族中扩大新的产品艰难,须要批改形象工厂的接口。减少了零碎的抽象性和了解难度。
WX搜寻:程序员个人修养 订阅最新内容