先看下一个简单的实现:
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.
这样做能够避免修改原有的代码,缺点是:代码量增加了不少!!!