所有的工厂模式都是用来封装对象的创建。工厂方法模式通过让子类决定要创建的对象是什么来达到封装对象创建过程的目的。DesignPrincipleDependencyInversionPrinciple依靠抽象,而不是具体的类工厂方法模式的定义定义了一个创建对象的接口,但是子类决定实例化哪个类。工厂方法让类将实例化推迟到子类。正如定义所说,工厂方法让子类决定实例化哪个类。所谓“决定”并不是说模式让子类自己在运行时做出决定,而是在编写创建者类时,不需要知道实际创建的是哪个产品。选择使用哪个子类自然决定了实际创建的产品。类图代码实现我们以上面的咖啡店为例。一个大的咖啡店不能只有一家,要遍布全国,比如上海、北京、深圳……都会有分店。而且如果经营得好,分店的数量就会增加。那么,虽然每个地区的分店都卖咖啡,但是为了满足每个地区顾客的需求和喜好,也会根据当地特色略有不同。比如上海人喜欢吃甜的,所以同款上海分店出品的咖啡可能会偏甜。北京人口味咸鲜,讲究浓郁,所以同样的咖啡味道更浓。深圳属于南方,口味清淡,可能多是原味咖啡,没有加奶加糖,浓稠度适中。。。对于咖啡店来说,从制作咖啡到送到顾客手中,还有一系列的步骤,比如包装。。。而这个包装好的流程程序与咖啡的品类关系不大。下面我们用代码来实现:packagecom.study.design.Factory.factorymethod;/***被生成对象的抽象父类*/publicabstractclassCoffe{protectedStringcoffeName;publicStringgetCoffeName(){返回咖啡名称;}}packagecom.study.design.Factory.factorymethod;publicclassSHLatteCoffeextendsCoffe{publicSHLatteCoffe(){coffeName="shanghailatte";};}packagecom.study.design.Factory.factorymethod;publicclassSHMochaCoffeextendsCoffe{publicSHMochaCoffe(){coffeName="上海摩卡";}}packagecom.study.design.Factory.factorymethod;publicclassBJLatteCoffeextendsCoffe{publicBJLatteCoffe(){coffeName="北京拿铁咖啡";}}packagecom.study.design.Factory.factorymethod;publicclassBJMochaCoffeextendsCoffe{publicBJMochaCoffe(){coffeName="北京摩卡";}}packagecom.study.design.Factory.factorymethod;publicclassSZLatteCoffeextendsCoffe{publicSZLatteCoffe(){coffeName="深圳拿铁";}}包com.study.design.Factory.factorymethod;publicclassSZMochaCoffeextendsCoffe{publicSZMochaCoffe(){coffeeName="深圳摩卡";}}包com.study。design.Factory.factorymethod;/***咖啡店,现在是一个抽象类*完成制作咖啡的所有过程,但是制作咖啡的具体口味由子类决定*/publicabstractclassCoffeeStores{/***咖啡生产工厂方法*@paramtype*@return*/publicCoffeproductCoffe(inttype){Coffecoffee=makeCoffe(type);盒子();还咖啡;}/***包装*/privatevoidbox(){System.out.println("打包...");/***工厂方法*制作咖啡的动作由子类实现*@paramtype*@return*/protectedabstractCoffemakeCoffe(inttype);}packagecom.study.design.Factory.factorymethod;/***工厂类*上海咖啡店*/publicclassSHCoffeStoresextendsBJCoffeStores{@OverrideprotectedCoffemakeCoffe(inttype){如果(1==类型){返回新的SHMochaCoffe();}else{返回新的SHLatteCoffe();}}}packagecom.study.design.Factory.factorymethod;publicclassBJCoffeStoresextendsCoffeStores{@OverrideprotectedCoffemakeCoffe(inttype){if(1==type){returnnewBJMochaCoffe();}}else{returnnewBJLatteCoffe();}}}packagecom.study.design.Factory.factorymethod;publicclassSZCoffeStoresextendsCoffeStores{@OverrideprotectedCoffemakeCoffe(inttype){if(1==type){returnnewSZMochaCoffe();}}else{返回新的SZLatteCoffe();}}}packagecom.study.design.Factory.factorymethod;publicclassSHConsumer{privateCoffeStorescoffeStores;publicSHConsumer(CoffeStorescoffeStores){this.coffeStores=coffeStores;}publicvoiddrink(inttype){Coffecoffe=coffeStores.productCoffe(type);System.out.println("我喝了一杯"+coffe.getCoffeName());}}packagecom.study.design.Factory.factorymethod;publicclassBJConsumer{privateCoffeStorescoffeStores;publicBJConsumer(CoffeStorescoffeStores){this.coffeStores=coffeStores;}publicvoiddrink(inttype){Coffecoffe=coffeStores.productCoffe(type);System.out.println("我喝了一杯"+coffe.getCoffeName());}}packagecom.study.design.Factory.factorymethod;publicclassSZConsumer{privateCoffeStorescoffeStores;publicSZConsumer(CoffeStorescoffeStores){this.coffeStores=coffeStores;}publicvoiddrink(inttype){Coffecoffe=coffeStores.productCoffe(type);System.out.println("我喝了一杯"+coffe.getCoffeName());}}packagecom.study.design.Factory.factorymethod;publicclassFactoryMethodTest{publicstaticvoidmain(String[]args){//创建三个地方SHCoffeStoresshCoffeStores=newSHCoffeStores();BJCoffeStoresbjCoffeStores=newBJCoffeStores();SZCoffeStoresszCoffeStores=newSZCoffeStores();//在三个区域创建消费者SHConsumershConsumer=newBjConsumer(sh;CoffeStores)newBJConsumer(bjCoffeStores);SZConsumerszConsumer=newSZConsumer(szCoffeStores);//消费者消费各自地区的咖啡shConsumer.drink(1);bjConsumer.drink(2);szConsumer.drink(1);方法,即有一个方法作为工厂来创建对象。此方法被定义为抽象的,并依赖于子类来处理对象创建。在父类中,可以定义所有对象共有的一些行为,比如包装……每个抽象方法的具体实现子类都可以看作是一个简单的工厂。一般只负责创建实例对象。用户通过选择不同的子类获得不同的对象。简单工厂和工厂方法模式的区别:简单工厂把所有的事情都处理在一个地方,而工厂方法创建一个框架,让子类决定如何实现具体对象的创建。简单工厂可以创建对象,但是简单工厂没有工厂方法的灵活性,因为简单工厂不能改变正在创建的产品。当只有一个SHCoffeStores时,工厂方法模式的优点是什么?虽然只有一个具体的创建者,但是工厂方法模式还是有用的,它帮助我们将产品的“实现”和“使用”解耦。如果添加新的咖啡品种,CoffeStores不会受到影响,因为CoffeStores没有与任何SHCoffeStores紧密耦合。WXSearch-程序员的个人修养
