黑马程序员技术交流社区

标题: 工厂模式的疑问 [打印本页]

作者: 王敏NO.09    时间: 2012-4-24 17:37
标题: 工厂模式的疑问
今天学习代理,老师提到了工厂模式,求详解工厂模式,以及在代理中用处
作者: 周海诚    时间: 2012-4-24 17:46
本帖最后由 周海诚 于 2012-4-24 17:50 编辑

工厂模式主要是为创建对象提供了接口分为三类:
1. 简单工厂模式(Simple Factory)               
2. 工厂方法模式(Factory Method)
3. 抽象工厂模式(Abstract Factory)
这三种模式从上到下逐步抽象,并且更具一般性。
还有一种分类法,就是将简单工厂模式看为工厂方法模式的一种特例,两个归为一类。两者皆可。
大体有两点:
1.在编码时不能预见需要创建哪种类的实例。
2.系统不应依赖于产品类实例如何被创建、组合和表达的细节

《Java与模式》中说明很详细。
作者: 赵嘉男    时间: 2012-4-24 17:52
工厂模式嘛,就是你要用一个自定义类的对象时,用这个工厂类来获取他的对象,也就是不用你在需要的那个地方用ABC a=new ABC();这中new方法。对于一个可扩展性强的网站,这是很重要的。比如在某个时候,你修改了ABC这个类,并且修改了他的构造函数,那么你要在对应地方修改ABC a=new ABC();为ABC a=new ABC("XXX");(比方构造函数成这样了)。这样如果有很多地方,你岂不是要该很多地方,这样很容易出错的。
    如果用工厂模式,你用到ABC类的对象时就用 ABC a=ABC.getObj();(前提是工厂类中有个getObj()方法用来返回ABC的对象),这样就算ABC改变也不用修改每个地方的代码了,止需要修改工厂类中的getObj()函数就可以了。这样既方便又安全。
工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。   我们以类Sample为例, 如果我们要创建Sample的实例对象:   Sample sample=new Sample();   可是,实际情况是,通常我们都要在创建sample实例时做点初始化的工作,比如赋值 查询数据库等。   首先,我们想到的是,可以使用Sample的构造函数,这样生成实例就写成:   Sample sample=new Sample(参数);   但是,如果创建sample实例时所做的初始化工作不是像赋值这样简单的事,可能是很长一段代码,如果也写入构造函数中,那你的代码很难看了(就需要Refactor重整)。

作者: 毕博    时间: 2012-4-24 18:06
工厂模式按照《Java与模式》中的提法分为三类: 1. 简单工厂模式(Simple Factory) 2. 工厂方法模式(Factory Method) 3. 抽象工厂模式(Abstract Factory) 这三种模式从上到下逐步抽象,并且更具一般性。所以我建议在这种情况下使用简单工厂模式与工厂方法模式相结合的方式来减少工厂类:即对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实现。来看看抽象工厂模式的各个角色(和工厂方法的如出一辙): 抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。

工厂模式有三个参与者,抽象产品(Product)、工厂(Creator)和具体产品(ConcreteProduct)。客户只会看到工厂和抽象产品。

public interface Product{
public String getName();
}

public class ConcreteProduct implements Product{
public String getName(){
return "产品1";
}
}

public class Creator{
public static Product create1(){
return new ConcreteProduct();
}
}

工厂模式的作用在于将创建具体产品的方法由工厂类控制,客户只需要知道产品的抽象类型
关于JAVA-单例模式,工厂模式,代理设计,模板设计
V1. 单例模式,工厂模式,代理设计,模板设计


V2. 工厂模式

工厂模式介绍(java)收藏
一、引子
       话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰)、Bmw(宝马)、Audi(奥迪)看来这人比较爱国,没有日本车),还雇了司机为他开车。不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上Audi后他说“开奥迪车!”。
       你一定说:这人有病!直接说开车不就行了?!
       而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!
       幸运的是,这种有病的现象在OO语言中可以避免了。下面以Java语言为基础来引入我们本文的主题:工厂模式!!
   等我们讲完后,大概你就能知道了      
        正如我前面提到的简单工厂模式适用于业务将简单的情况下。而对于复杂的业务环境可能不太适应阿。这就应该由工厂方法模式来出场了!!

作者: 王敏NO.09    时间: 2012-4-24 20:10
谢谢大家




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2