工厂模式:属于创建型模式。同我们生活中的厂家很相似。我们并不自己制造(new)产品,而是依靠厂家制造,我们只是拿来使用。简单的说就是让工厂
根据我们的需求给我们new一个对象。
工厂模式又分为工厂方法模式和抽象工厂模式。 工厂方法模式又分为:普通工厂方法,静态工厂方法.
package com.pattern.build.facotry.simple; /** * 水果接口 * @author chuer * @date 2014-7-24 下午6:15:44 * @version V1.0 */ public interface Fruit { public void name(); //水果名称 }
package com.pattern.build.facotry.simple; /** * 苹果 * @author chuer * @date 2014-7-24 下午6:16:08 * @version V1.0 */ public class Apple implements Fruit { @Override public void name() { System.out.println("apple"); } }
package com.pattern.build.facotry.simple; /** * 橘子 * @author chuer * @date 2014-7-24 下午6:16:19 * @version V1.0 */ public class Orange implements Fruit { @Override public void name() { System.out.println("orange"); } }
package com.pattern.build.facotry.simple; public class FruitFactory {//这个工厂是一个单例模式(针对普通工厂方法) private FruitFactory(){} private static FruitFactory factory = new FruitFactory(); public static FruitFactory getInstance(){ return factory; } //普通工厂方法模式: /** * 根据水果名称 实例化一个水果对象 * @param name * @return */ public Fruit createFruit(String name){ Fruit fruit = null; if(name.equals("apple")){ fruit = new Apple(); }else if(name.equals("orange")){ fruit = new Orange(); } return fruit; } /** * 创建苹果 * @return */ public Fruit createApple(){ return new Apple(); } /** * 创建橘子 * @return */ public Fruit createOrange(){ return new Orange(); } //----------------------------分割线----------------------------------- //静态工厂方法模式 public static Fruit create_fruit(String name){ Fruit fruit = null; if(name.equals("apple")){ fruit = new Apple(); }else if(name.equals("orange")){ fruit = new Orange(); } return fruit; } /** * 创建苹果 * @return */ public static Fruit create_apple(){ return new Apple(); } /** * 创建橘子 * @return */ public static Fruit create_orange(){ return new Orange(); } }
package com.pattern.build.facotry.simple; public class Client { public static void main(String[] args) { Fruit fruit = FruitFactory.getInstance().createFruit("apple"); fruit.name(); fruit = FruitFactory.getInstance().createFruit("orange"); fruit.name(); } }
通过代码我们可以看出每种工厂方法模式都有两种写法,其中一种需要我们传递一个标识来确定要创建那种产品,而另一种不需要。
也就是一种是单方法一种是多方法。
优点就是简单易用。但是同样优点也是它的缺点 :当我们要新加一种叫做香蕉的水果时,我们必须修改工厂类。对我们后期维护增加
了一点负担。
抽象工厂模式可以拟补这一缺点。
package com.pattern.build.facotry.abs; import com.pattern.build.facotry.simple.Fruit; public interface AbstractFactory { public Fruit crearFruit(); }
package com.pattern.build.facotry.abs; import com.pattern.build.facotry.simple.Apple; import com.pattern.build.facotry.simple.Fruit; public class AppleFactory implements AbstractFactory { @Override public Fruit crearFruit() { return new Apple(); } }
package com.pattern.build.facotry.abs; import com.pattern.build.facotry.simple.Fruit; import com.pattern.build.facotry.simple.Orange; public class OrangeFactory implements AbstractFactory { @Override public Fruit crearFruit() { return new Orange(); } }
看到抽象工厂模式的代码,我们看到确实如果要增加一种水果的话,不用修改原来以后的工厂类,而是重新建立一个类。但是如果存在很多的
水果那么就会出现很多的工厂类。
总之,工厂方法模式和抽象工厂模式各有优势。可以根据自己的真实情况,选择使用。