博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式-工厂模式[Factory]
阅读量:5881 次
发布时间:2019-06-19

本文共 6184 字,大约阅读时间需要 20 分钟。

 先看下一个简单的实现:

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     // 勾画shape12     public abstract void draw();13 14     // 擦去 shape15     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.

这样做能够避免修改原有的代码,缺点是:代码量增加了不少!!!

转载于:https://www.cnblogs.com/masque/p/3837710.html

你可能感兴趣的文章
Autofs自动挂载服务
查看>>
python的升级
查看>>
springmvc工具类封装RowMapper
查看>>
Django开发运维后台(三):利用ListView分页显示数据
查看>>
spring
查看>>
Python对进程Multiprocessing子进程返回值
查看>>
tomcat下java.io.NotSerializableException错误的解决方法
查看>>
Python入门之函数式开发
查看>>
IOS配置SSH一定需要先配置hostname和domain-name吗?
查看>>
java基础第十二天
查看>>
Django之MTV
查看>>
三级菜单
查看>>
DIY强大的虚拟化环境-升级存储主机
查看>>
Spring源码解析(三)——容器创建
查看>>
document.bgcolor设置文档的背景颜色
查看>>
星期天写了点蛋疼的东西(1)
查看>>
A10的上网链路负载实现
查看>>
文件I/O
查看>>
橙子引擎CEO尚韬: 蓝海破冰,重新定义TV游戏
查看>>
Spring中factory-method的使用
查看>>