java设计模式之工厂模式(2)

来源:互联网 发布:淘宝网的营销策略 编辑:程序博客网 时间:2024/05/18 03:29

工厂模式:属于创建型模式。同我们生活中的厂家很相似。我们并不自己制造(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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic Fruit crearFruit() {return new Orange();}}

看到抽象工厂模式的代码,我们看到确实如果要增加一种水果的话,不用修改原来以后的工厂类,而是重新建立一个类。但是如果存在很多的
  水果那么就会出现很多的工厂类。
  
  
  
  总之,工厂方法模式和抽象工厂模式各有优势。可以根据自己的真实情况,选择使用。

0 0
原创粉丝点击