大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > Java技巧 > java实现简单工厂模式

java实现简单工厂模式

关键词:工厂模式简单  阅读(644) 赞(13)

[摘要]工厂模式只是把依赖关系转移了,工厂模式的好处是降低耦合,要直接依赖的对象就不直接依赖了(通过接口或者工厂类解耦)。问题的提出是:被调用者的类可能发生变化。

设计模式中的工厂是用来生产对象的。在没有简单工厂的模式下,调用者和被调用者直接在代码中产生联系。

工厂模式只是把依赖关系转移了,工厂模式的好处是降低耦合,要直接依赖的对象就不直接依赖了(通过接口或者工厂类解耦)。

问题的提出是:被调用者的类可能发生变化。(因此引入了简单工厂模式)

简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式。

代码示例:

如果在没有工厂模式的实现:

public class FactoryDemo {

    public static void main(String[] args) {

        // 调用者的代码实现里面直接new了被调用者的类

        // 这种实现叫直接依赖关系

        // 如果被调用者发生改变,下面的这些调用代码就会有改变

        ClothDoll cd = new ClothDoll();

        System.out.println(cd.getInfo());

        BarbieDoll bd = new BarbieDoll();

        System.out.println(bd.getInfo());

 

    }

}

 

class ClothDoll {

    public String getInfo() {

        return "我是布娃娃,我怕脏";

    }

}

 

class BarbieDoll {

    public String getInfo() {

        return "我是芭比娃娃,我美得不可思议";

    }

}

 

如何解决直接依赖关系?

解决办法:通过工厂模式进行分解,让客户端去依赖对象,而不直接依赖产品。需要引入第三方的类:工厂类。

 

简单工厂模式示例代码:

 

public class FactoryDemo {

    // 调用者,下面的两个Doll接口的实现类是被调用者

    // 被调用者对象可能发生变化,使用工厂模式使得对象创建的扩展性变差

    // 思想:不让客户端直接依赖被调用者类

    // 中间人:DollFactory

    

    // 直接new叫耦合(太依赖了!),工厂模式就很好滴做到了解耦

    public static void main(String[] args) {

        // 调用者的代码实现里面直接new了被调用者的类

        // 这种实现叫直接依赖

        // 如果被调用者发生改变,下面的这些调用代码就会有改变

        Doll clothDoll = DollFactory.getInstance("cloth");

        if(clothDoll!=null)

        System.out.println(clothDoll.getInfo());

        

        Doll barbie = DollFactory.getInstance("barbie");

        if(barbie!=null)

        System.out.println(barbie.getInfo());

 

    }

}

 

 

/**

* 加入的工厂类

* @author Administrator

*

*/

 

class DollFactory{

    // 获取一个娃娃,思考使用接口的原因

// 引入接口的主要原因是,返回对象的类型是不确定的,需要用一个统一的接口来表达对象的类型

    public static Doll getInstance(String name){

        // 根据条件生产不同的对象

        if("cloth".equals(name)){

            return new ClothDoll();

        }else if("barbie".equals(name)){

            return new BarbieDoll();

        }

        return null;        

    }

}

 

// 生产的娃娃对象

interface Doll{

    String getInfo();

}

 

class ClothDoll implements Doll {

    public String getInfo() {

        return "我是布娃娃,我怕脏";

    }

}

 

class BarbieDoll implements Doll {

    public String getInfo() {

        return "我是芭比娃娃,我美得不可思议";

    }

}



相关评论