设计模式-工厂模式[Factory]
先看下一个简单的实现:
1 package org.masque.designpatterns.factorymethod.one; 2 /** 3 * 4 * Description: Sample子类的标示 5 * BeanEm.java Create on 2014年7月11日 下午2:37:58 6 * @author masque.java@outlook.com 7 * @version 1.0 8 * Copyright (c) 2014 Company,Inc. All Rights Reserved. 9 */ 10 public enum BeanEm { 11 12 ONE, 13 14 TWO, 15 16 THREE; 17 }
package org.masque.designpatterns.factorymethod.one; /** * * Description:抽象父类 * Sample.java Create on 2014年7月11日 下午3:56:01 * @author masque.java@outlook.com * @version 1.0 * Copyright (c) 2014 Company,Inc. All Rights Reserved. */ public abstract class Sample { public Sample(){ System.out.println(this); } }
1 package org.masque.designpatterns.factorymethod.one; 2 /** 3 * 4 * Description:子类A 5 * SampleA.java Create on 2014年7月11日 下午3:56:32 6 * @author masque.java@outlook.com 7 * @version 1.0 8 * Copyright (c) 2014 Company,Inc. All Rights Reserved. 9 */ 10 public class SampleA extends Sample{ 11 12 public SampleA(){ 13 } 14 }
1 package org.masque.designpatterns.factorymethod.one; 2 /** 3 * 4 * Description:子类B 5 * SampleB.java Create on 2014年7月11日 下午3:56:32 6 * @author masque.java@outlook.com 7 * @version 1.0 8 * Copyright (c) 2014 Company,Inc. All Rights Reserved. 9 */ 10 public class SampleBextends Sample{ 11 12 public SampleB(){ 13 } 14 }
1 package org.masque.designpatterns.factorymethod.one; 2 3 /** 4 * 5 * Description: BeanFactory.java Create on 2014年7月11日 下午2:38:29 6 * 7 * @author masque.java@outlook.com 8 * @version 1.0 Copyright (c) 2014 Company,Inc. All Rights Reserved. 9 */ 10 public class BeanFactory { 11 12 public static Sample createSample(BeanEm em) { 13 switch (em) { 14 case ONE: 15 return new SampleA(); 16 case TWO: 17 return new SampleB(); 18 default: 19 return null; 20 } 21 } 22 }
1 package org.masque.designpatterns.factorymethod.one; 2 /** 3 * 4 * Description:测试 5 * Test.java Create on 2014年7月11日 下午3:56:59 6 * @author masque.java@outlook.com 7 * @version 1.0 8 * Copyright (c) 2014 Company,Inc. All Rights Reserved. 9 */ 10 public class Test { 11 12 public static void main(String[] args) { 13 BeanFactory.createSample(BeanEm.ONE); 14 BeanFactory.createSample(BeanEm.TWO); 15 } 16 }
先定义一个抽象的父类
1 package org.masque.designpatterns.factorymethod.two; 2 3 /** 4 * 5 * Description: Shape.java Create on 2014年7月10日 下午4:53:27 6 * 7 * @author masque.java@outlook.com 8 * @version 1.0 Copyright (c) 2014 Company,Inc. All Rights Reserved. 9 */ 10 public abstract class Shape { 11 // 勾画shape 12 public abstract void draw(); 13 14 // 擦去 shape 15 public abstract void erase(); 16 17 public String name; 18 19 public Shape(String name) { 20 this.name = name; 21 } 22 }
再定义一个抽象工厂的父类
1 package org.masque.designpatterns.factorymethod.two; 2 3 public abstract class ShapeFactory { 4 protected abstract Shape factoryMethod(String aName); 5 6 // 在anOperation中定义Shape的一系列行为 7 public void anOperation(String aName) { 8 Shape s = factoryMethod(aName); 9 System.out.println("The current shape is: " + s.name); 10 s.draw(); 11 s.erase(); 12 } 13 }
子类一:
1 package org.masque.designpatterns.factorymethod.two; 2 /** 3 * 4 * Description: 5 * Circle.java Create on 2014年7月10日 下午5:28:06 6 * @author masque.java@outlook.com 7 * @version 1.0 8 * Copyright (c) 2014 Company,Inc. All Rights Reserved. 9 */ 10 public class Circle extends Shape { 11 12 public void draw() { 13 System.out.println("It will draw a circle."); 14 } 15 16 public void erase() { 17 System.out.println("It will erase a circle."); 18 } 19 20 // 构造函数 21 public Circle(String name) { 22 super(name); 23 } 24 25 }
1 package org.masque.designpatterns.factorymethod.two; 2 /** 3 * 4 * Description: 5 * CircleFactory.java Create on 2014年7月10日 下午5:28:18 6 * @author masque.java@outlook.com 7 * @version 1.0 8 * Copyright (c) 2014 Company,Inc. All Rights Reserved. 9 */ 10 public class CircleFactory extends ShapeFactory { 11 // 重载factoryMethod方法,返回Circle对象 12 protected Shape factoryMethod(String aName) { 13 return new Circle(aName + " (created by CircleFactory)"); 14 } 15 }
子类二:
1 package org.masque.designpatterns.factorymethod.two; 2 /** 3 * 4 * Description: 5 * Square.java Create on 2014年7月10日 下午5:28:25 6 * @author masque.java@outlook.com 7 * @version 1.0 8 * Copyright (c) 2014 Company,Inc. All Rights Reserved. 9 */ 10 public class Square extends Shape { 11 public void draw() { 12 System.out.println("It will draw a square."); 13 } 14 15 public void erase() { 16 System.out.println("It will erase a square."); 17 } 18 19 // 构造函数 20 public Square(String name) { 21 super(name); 22 } 23 }
1 package org.masque.designpatterns.factorymethod.two; 2 /** 3 * 4 * Description: 5 * SquareFactory.java Create on 2014年7月10日 下午5:28:31 6 * @author masque.java@outlook.com 7 * @version 1.0 8 * Copyright (c) 2014 Company,Inc. All Rights Reserved. 9 */ 10 public class SquareFactory extends ShapeFactory { 11 12 // 重载factoryMethod方法,返回Square对象 13 protected Shape factoryMethod(String aName) { 14 return new Square(aName + " (created by SquareFactory)"); 15 } 16 }
测试:
1 package org.masque.designpatterns.factorymethod.two; 2 /** 3 * 4 * Description: 5 * Test.java Create on 2014年7月10日 下午5:28:44 6 * @author masque.java@outlook.com 7 * @version 1.0 8 * Copyright (c) 2014 Company,Inc. All Rights Reserved. 9 */ 10 public class Test { 11 12 public static void main(String[] args) { 13 ShapeFactory sf1 = new SquareFactory(); 14 ShapeFactory sf2 = new CircleFactory(); 15 sf1.anOperation("Shape one"); 16 sf2.anOperation("Shape two"); 17 } 18 }
The current shape is: Shape one (created by SquareFactory)
It will draw a square.
It will erase a square.
The current shape is: Shape two (created by CircleFactory)
It will draw a circle.
It will erase a circle.
这样做能够避免修改原有的代码,缺点是:代码量增加了不少!!!