设计模式分解java(1)

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

  那么在你的程序中,如果要实例化Sample时.就使用

  Sample sampleA=Factory.creator(1);

  这样,在整个就不涉及到Sample的具体子类,达到封装效果,也就减少错误修改的机会,

  这个原理可以用很通俗的话来比喻:就是具体事情做得越多,越容易范错误.

  这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,范错误可能性就越少.

  好象我们从编程序中也能悟出人生道理?呵呵.

  使用工厂方法 要注意几个角色,首先你要定义产品接口,如上面的Sample,

  产品接口下有Sample接口的实现类,如SampleA,其次要有一个factory类,用来生成产品Sample,

  进一步稍微复杂一点,就是在工厂类上进行拓展,工厂类也有继承它的实现类concreteFactory了。

  抽象工厂

  工厂模式中有: 工厂方法(Factory Method) 抽象工厂(Abstract Factory).

  这两个模式区别在于需要创建对象的复杂程度上。如果我们创建对象的方法变得复杂了,

  如上面工厂方法中是创建一个对象Sample,如果我们还有新的产品接口Sample2.

  这里假设:Sample有两个concrete类SampleA和SamleB,而Sample2也有两个concrete类Sample2A和SampleB2

  那么,我们就将上例中Factory变成抽象类,将共同部分封装在抽象类中,不同部分使用子类实现,

  下面就是将上例中的Factory拓展成抽象工厂:

  public abstract class Factory{

  public abstract Sample creator();

  public abstract Sample2 creator(String name);

  }

  public class SimpleFactory extends Factory{

  public Sample creator(){

  ………

  return new SampleA

  }

  public Sample2 creator(String name){

  ………

  return new Sample2A

  }

  }

  public class BombFactory extends Factory{

  public Sample creator(){

  ……

  return new SampleB

  }

  public Sample2 creator(String name){

  ……

  return new Sample2B

  }

  }

  从上面看到两个工厂各自生产出一套Sample和Sample2,

  也许你会疑问,为什么我不可以使用两个工厂方法来分别生产Sample和Sample2?

  抽象工厂还有另外一个关键要点,是因为 SimpleFactory内,

  生产Sample和生产Sample2的方法之间有一定联系,所以才要将这两个方法捆绑在一个类中,

  这个工厂类有其本身特征,也许制造过程是统一的,比如:制造工艺比较简单,所以名称叫SimpleFactory。

  在实际应用中,工厂方法用得比较多一些,而且是和动态类装入器组合在一起应用,

  举例

  我们以Jive的ForumFactory为例,这个例子在前面的Singleton模式中我们讨论过,现在再讨论其工厂模式:

  public abstract class ForumFactory {

  private static Object initLock = new Object();

  private static String className = “com.jivesoftware.forum.database.DbForumFactory”;

  private static ForumFactory factory = null;

  public static ForumFactory getInstance(Authorization authorization) {

  //If no valid authorization passed in, return null.

  if (authorization == null) {

  return null;

  }

  //以下使用了Singleton 单态模式

  if (factory == null) {

  synchronized(initLock) {

  if (factory == null) {

  ……

  try {

  Class c = Class.forName(className);

  factory = (ForumFactory)c.newInstance();

  }

  catch (Exception e) {

  return null;

  }

  }

  }

  }

  //Now, 返回 proxy.用来限制授权对forum的访问

  return new ForumFactoryProxy(authorization, factory,

  factory.getPermissions(authorization));

  }

  //真正创建forum的方法由继承forumfactory的子类去完成.

  public abstract Forum createForum(String name, String description)

  throws UnauthorizedException, ForumAlreadyExistsException;

  ….

  }

[1][2][3]

不然你大概会一直好奇和不甘吧——

设计模式分解java(1)

相关文章:

你感兴趣的文章:

标签云: