java工厂模式

zyhUTTP 2013-07-12 03:51:28
创建一个Cycle接口及其Unicycle,Bicycle的是实现。对每种类型的Cycle都创建相应的工厂,然后编写代码使用这写工厂。
interface Cycle{void run();}
interface CycleFactory{Cycle getCycle();}

class Unicycle implements Cycle{
public void run(){
System.out.println("Unicycle!");
}
}

class UnicycleFactory implements CycleFactory{
public Cycle getCycle(){return new Unicycle();}
}

class Bicycle implements Cycle{
public void run(){
System.out.println("Bicycle!");
}
}

class BicycleFactory implements CycleFactory{
public Cycle getCycle(){ return new Bicycle();}
}
public class CycleTest {
public static void runBicycle(CycleFactory fact){
Cycle c = fact.getCycle();
c.run();
}
public static void main(String[] args) {
runBicycle(new UnicycleFactory());
runBicycle(new BicycleFactory());

}

}

这样写工厂模式有什么作用?不用工厂模式也可以很好的实现

interface Cycle{void run();}


class Unicycle implements Cycle{
public void run(){
System.out.println("Unicycle!");
}
}



class Bicycle implements Cycle{
public void run(){
System.out.println("Bicycle!");
}
}


public class CycleTest {
public static void runBicycle(Cycle c){
c.run();
}
public static void main(String[] args) {
runBicycle(new Unicycle());
runBicycle(new Bicycle());

}

}
...全文
714 17 打赏 收藏 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
疯狂熊猫人 2015-10-04
  • 打赏
  • 举报
回复
方便以后扩展。如果觉得以后没有扩展的必要,这个模式感觉意义不是很大。设计还是要基于项目实际情况
解开者 2015-09-29
  • 打赏
  • 举报
回复
不要基于代码讨论设计模式,项目规模大了之后才能看得到效果。 将生产对象委托给工厂可能存在这样一种考虑:我作为API程序员,创建对象需要的部分资源是应用程序员无法获取的,或者为了封装和安全考虑我不希望他们获取,所以我想把创建对象在我这一层实现,只对外暴露必要的调用方式。我理解的工厂模式主要起这种作用。比如说Calendar,DriverManager,Class以及反射包里的一大堆newInstance
qq_24842363 2015-09-29
  • 打赏
  • 举报
回复
其实在工厂里面可以选择哪个实例对象吧?减少主方法的代码,我的理解是这样
尾号0505 2013-07-15
  • 打赏
  • 举报
回复
摆烂办不到 2013-07-15
  • 打赏
  • 举报
回复
路过 学习 说实话 看了半天楼主的两种代码 觉得是没多大差距 明天再看看 先收藏了
lcf 2013-07-15
  • 打赏
  • 举报
回复
引用 12 楼 Inhibitory 的回复:
组件的装配 这个是Builder模式,不是工厂模式。 他们都是创建的模式,但是有一些区别。
Builder模式主要用来替代构造函数的重载。这么说:一个汽车车间,给一辆车装上德国引擎或者国产引擎,生产出两种不同的车,比较像工厂;同样的车间,一个给车上装了音响,一个没装,这就比较像Builder的用法。(见Effective Java 第二版Item2)
Inhibitory 2013-07-15
  • 打赏
  • 举报
回复
组件的装配 这个是Builder模式,不是工厂模式。 他们都是创建的模式,但是有一些区别。
lcf 2013-07-15
  • 打赏
  • 举报
回复
楼上的两位别吵了,只讨论技术,不要人身攻击,也不提倡诡辩,没有意义。 工厂模式在单独的代码里讨论没有意义,要放在一个大的项目框架下才有意义。这里就不得不提一下Spring,其最基本的功能就是一个大工厂,负责装配各种组件。 在你的例子里,工厂并没有提供装配组件的功能,这是一个幼稚的工厂,在这个例子里,直接new和工厂没有区别。但是,一旦加上了其他组件,就不同了。 我觉得可以写一篇博来讲这个,先简单提一下:
interface ICycle {
  void run();
  void setWheel(IWheel wheel);
}

Unicycle implements ICycle {
  private IWheel iWheel;
  @Override
  public void run() {System.out.println("Unicycle of wheel: " + iWheel;)}
  public void setWheel(IWheel wheel) {iWheel = wheel;}
}

Bicycle implements ICycle {
  private IWheel iWheel;
  @Override
  public void run() {System.out.println("Bicycle of wheel: " + iWheel;)}
  public void setWheel(IWheel wheel) {iWheel = wheel;}
}

GoodWheel implements IWheel {
  @Override
  public String toString() {return "good wheel";}
}

BadWheel implements IWheel {
  @Override
  public String toString() {return "bad wheel";}
}

interface ICycleFactory{
  ICycle getCycle();
}

class GoodWheelBicycleFactory implements ICycleFactory {
  @Override
  public ICycle getCycle() {
    iCycle cycle = new Bicycle();
    cycle.setWheel(new GoodWheel());
    return cycle;
  }
}

public static void main (final String[] args) {
  runCycle (new GoodWheelBicycleFactory());
}
对比下面的代码:
interface ICycle {
  void run();
  void setWheel(IWheel wheel);
}

Unicycle implements ICycle {
  private IWheel iWheel;
  @Override
  public void run() {System.out.println("Unicycle of wheel: " + iWheel;)}
  public void setWheel(IWheel wheel) {iWheel = wheel;}
}

Bicycle implements ICycle {
  private IWheel iWheel;
  @Override
  public void run() {System.out.println("Bicycle of wheel: " + iWheel;)}
  public void setWheel(IWheel wheel) {iWheel = wheel;}
}

GoodWheel implements IWheel {
  @Override
  public String toString() {return "good wheel";}
}

BadWheel implements IWheel {
  @Override
  public String toString() {return "bad wheel";}
}

public static void main (final String[] args) {
  Cycle cycle = new Bicycle();
  cycle.setWheel(new Wheel());
  runCycle (cycle);
}
这里只有一个cycle,假设不同的Cycle有不同的Wheel,这样排列组合一下光是这里已经有4个组合了。在一个复杂的程序里,组件的数量远远不止这一些,而且你使用API的时候,如果组件的装配由你自己来实现,这将是一件多么混乱的事情。所以就有了工厂模式,把某一种组件的装配包装成一个有意义的类,便于使用。
Inhibitory 2013-07-15
  • 打赏
  • 举报
回复
可能楼主想表达的是抽象工厂模式
小丑哥_V5 2013-07-15
  • 打赏
  • 举报
回复
引用 6 楼 beichui 的回复:
[quote=引用 4 楼 rainbowsix 的回复:] [quote=引用 3 楼 beichui 的回复:] [quote=引用 2 楼 rainbowsix 的回复:] 工厂模式不是你这样用的,建议你看正经的《设计模式》,不要看那些衍生出来的乱七八糟的东西。 全名《设计模式-可复用面向对象软件的基础》
不同意你的观点,他这种写法是标准的工厂方法模式,没什么问题。 解释下个人对工厂方法模式的理解: 有人会觉得这和直接调用具体产品类的构造方法似乎没有什么区别,因为使用者必然会“知道”一个具体类的构造方法,不是具体产品的构造方法,就是具体工厂的构造方法。 问题的关键在于,具体产品类的构造方法和具体工厂类的构造方法,哪一个更“稳定”? 具体工厂本质上只是一个封装层,内部不具有任何逻辑代码;而具体产品则不同,它和业务逻辑往往紧密关联,产品的功能实现来源于具体业务。很明显,相比较之下,具体工厂类和业务的相关性几乎为0,也就是说它们“被改动的风险”几乎为0,在这种情况下,使用者依赖具体工厂类,要远好过直接依赖具体产品类。 工厂模式有很多变化,各有优缺点,适用不同的场景,具体的看下我这篇文章。 http://www.cnblogs.com/liqingyuan/archive/2013/05/20/model_02.html[/quote] 我说的是用法不对,没说写法不对,你分得清用法写法的却别不?[/quote] 用法也没问题,他一样是把子类工厂实例丢给接口引用。[/quote] 好搞笑...一个设计模式用得好,就是要让别人看不出不和谐的地方,既然楼主第一种方式都感觉到不和谐,就证明有点大题小做,但是下面的实现定义接口就看着舒服简单多了,证明这个简单的问题应用第二种简单的接口定义实现
无聊找乐 2013-07-12
  • 打赏
  • 举报
回复
引用 6 楼 beichui 的回复:
[quote=引用 4 楼 rainbowsix 的回复:] [quote=引用 3 楼 beichui 的回复:] [quote=引用 2 楼 rainbowsix 的回复:] 工厂模式不是你这样用的,建议你看正经的《设计模式》,不要看那些衍生出来的乱七八糟的东西。 全名《设计模式-可复用面向对象软件的基础》
不同意你的观点,他这种写法是标准的工厂方法模式,没什么问题。 解释下个人对工厂方法模式的理解: 有人会觉得这和直接调用具体产品类的构造方法似乎没有什么区别,因为使用者必然会“知道”一个具体类的构造方法,不是具体产品的构造方法,就是具体工厂的构造方法。 问题的关键在于,具体产品类的构造方法和具体工厂类的构造方法,哪一个更“稳定”? 具体工厂本质上只是一个封装层,内部不具有任何逻辑代码;而具体产品则不同,它和业务逻辑往往紧密关联,产品的功能实现来源于具体业务。很明显,相比较之下,具体工厂类和业务的相关性几乎为0,也就是说它们“被改动的风险”几乎为0,在这种情况下,使用者依赖具体工厂类,要远好过直接依赖具体产品类。 工厂模式有很多变化,各有优缺点,适用不同的场景,具体的看下我这篇文章。 http://www.cnblogs.com/liqingyuan/archive/2013/05/20/model_02.html[/quote] 我说的是用法不对,没说写法不对,你分得清用法写法的却别不?[/quote] 用法也没问题,他一样是把子类工厂实例丢给接口引用。[/quote] 你觉得所谓的“用法” 就是指代码调用方法吗? 我指的不是这个~
北吹 2013-07-12
  • 打赏
  • 举报
回复
引用 4 楼 rainbowsix 的回复:
[quote=引用 3 楼 beichui 的回复:] [quote=引用 2 楼 rainbowsix 的回复:] 工厂模式不是你这样用的,建议你看正经的《设计模式》,不要看那些衍生出来的乱七八糟的东西。 全名《设计模式-可复用面向对象软件的基础》
不同意你的观点,他这种写法是标准的工厂方法模式,没什么问题。 解释下个人对工厂方法模式的理解: 有人会觉得这和直接调用具体产品类的构造方法似乎没有什么区别,因为使用者必然会“知道”一个具体类的构造方法,不是具体产品的构造方法,就是具体工厂的构造方法。 问题的关键在于,具体产品类的构造方法和具体工厂类的构造方法,哪一个更“稳定”? 具体工厂本质上只是一个封装层,内部不具有任何逻辑代码;而具体产品则不同,它和业务逻辑往往紧密关联,产品的功能实现来源于具体业务。很明显,相比较之下,具体工厂类和业务的相关性几乎为0,也就是说它们“被改动的风险”几乎为0,在这种情况下,使用者依赖具体工厂类,要远好过直接依赖具体产品类。 工厂模式有很多变化,各有优缺点,适用不同的场景,具体的看下我这篇文章。 http://www.cnblogs.com/liqingyuan/archive/2013/05/20/model_02.html[/quote] 我说的是用法不对,没说写法不对,你分得清用法写法的却别不?[/quote] 用法也没问题,他一样是把子类工厂实例丢给接口引用。
无聊找乐 2013-07-12
  • 打赏
  • 举报
回复
引用 4 楼 rainbowsix 的回复:
[quote=引用 3 楼 beichui 的回复:] [quote=引用 2 楼 rainbowsix 的回复:] 工厂模式不是你这样用的,建议你看正经的《设计模式》,不要看那些衍生出来的乱七八糟的东西。 全名《设计模式-可复用面向对象软件的基础》
不同意你的观点,他这种写法是标准的工厂方法模式,没什么问题。 解释下个人对工厂方法模式的理解: 有人会觉得这和直接调用具体产品类的构造方法似乎没有什么区别,因为使用者必然会“知道”一个具体类的构造方法,不是具体产品的构造方法,就是具体工厂的构造方法。 问题的关键在于,具体产品类的构造方法和具体工厂类的构造方法,哪一个更“稳定”? 具体工厂本质上只是一个封装层,内部不具有任何逻辑代码;而具体产品则不同,它和业务逻辑往往紧密关联,产品的功能实现来源于具体业务。很明显,相比较之下,具体工厂类和业务的相关性几乎为0,也就是说它们“被改动的风险”几乎为0,在这种情况下,使用者依赖具体工厂类,要远好过直接依赖具体产品类。 工厂模式有很多变化,各有优缺点,适用不同的场景,具体的看下我这篇文章。 http://www.cnblogs.com/liqingyuan/archive/2013/05/20/model_02.html[/quote] 我说的是用法不对,没说写法不对,你分得清用法写法的却别不?[/quote] 不好意思,打错字了,是别,不是
无聊找乐 2013-07-12
  • 打赏
  • 举报
回复
引用 3 楼 beichui 的回复:
[quote=引用 2 楼 rainbowsix 的回复:] 工厂模式不是你这样用的,建议你看正经的《设计模式》,不要看那些衍生出来的乱七八糟的东西。 全名《设计模式-可复用面向对象软件的基础》
不同意你的观点,他这种写法是标准的工厂方法模式,没什么问题。 解释下个人对工厂方法模式的理解: 有人会觉得这和直接调用具体产品类的构造方法似乎没有什么区别,因为使用者必然会“知道”一个具体类的构造方法,不是具体产品的构造方法,就是具体工厂的构造方法。 问题的关键在于,具体产品类的构造方法和具体工厂类的构造方法,哪一个更“稳定”? 具体工厂本质上只是一个封装层,内部不具有任何逻辑代码;而具体产品则不同,它和业务逻辑往往紧密关联,产品的功能实现来源于具体业务。很明显,相比较之下,具体工厂类和业务的相关性几乎为0,也就是说它们“被改动的风险”几乎为0,在这种情况下,使用者依赖具体工厂类,要远好过直接依赖具体产品类。 工厂模式有很多变化,各有优缺点,适用不同的场景,具体的看下我这篇文章。 http://www.cnblogs.com/liqingyuan/archive/2013/05/20/model_02.html[/quote] 我说的是用法不对,没说写法不对,你分得清用法写法的却别不?
北吹 2013-07-12
  • 打赏
  • 举报
回复
引用 2 楼 rainbowsix 的回复:
工厂模式不是你这样用的,建议你看正经的《设计模式》,不要看那些衍生出来的乱七八糟的东西。 全名《设计模式-可复用面向对象软件的基础》
不同意你的观点,他这种写法是标准的工厂方法模式,没什么问题。 解释下个人对工厂方法模式的理解: 有人会觉得这和直接调用具体产品类的构造方法似乎没有什么区别,因为使用者必然会“知道”一个具体类的构造方法,不是具体产品的构造方法,就是具体工厂的构造方法。 问题的关键在于,具体产品类的构造方法和具体工厂类的构造方法,哪一个更“稳定”? 具体工厂本质上只是一个封装层,内部不具有任何逻辑代码;而具体产品则不同,它和业务逻辑往往紧密关联,产品的功能实现来源于具体业务。很明显,相比较之下,具体工厂类和业务的相关性几乎为0,也就是说它们“被改动的风险”几乎为0,在这种情况下,使用者依赖具体工厂类,要远好过直接依赖具体产品类。 工厂模式有很多变化,各有优缺点,适用不同的场景,具体的看下我这篇文章。 http://www.cnblogs.com/liqingyuan/archive/2013/05/20/model_02.html
无聊找乐 2013-07-12
  • 打赏
  • 举报
回复
工厂模式不是你这样用的,建议你看正经的《设计模式》,不要看那些衍生出来的乱七八糟的东西。

全名《设计模式-可复用面向对象软件的基础》

S117 2013-07-12
  • 打赏
  • 举报
回复
工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧