简单工厂

简单工厂模式 

  1. 创建模式(简单工厂模式、工厂方法模式、抽象工厂模式、单例模式、多例模式、建造模式、原始模型模式)
  2. 结构模式(适配器模式、缺省适配模式、合成模式、装饰模式、代理模式、享元模式、门面模式、桥梁模式)
  3. 行为模式(不变模式、策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、解释器模式、调停者模式

本文要讲述第一个设计模式(其他设计模式请参考我的其他博客),简单工厂模式,它是创建模式中最基本的模式,创建模式是对类的实例化过程的抽象化,一些系统在创建对象时,需要动态地决定怎样创建对象,创建哪些对象,以及如何组合和表示这些对象。创建模式描述了怎样构造和封装这些动态的决定。

举例说明,比如有一个农场,专门向市场销售各种水果。在这个系统里需要描述下列水果

  • 葡萄 Grape
  • 草莓 Strawberry
  • 苹果 Apple

水果和其他的植物有很大不同,水果最终是可以采摘食用的。那么很自然地做法就是建立一个各种水果都适用的通用接口,以便与农场里的其他植物区分开,如下UML图所示

水果接口规定出所有的水果必须实现的接口,包括任何水果类必须具备的方法。种植plant(),生长grow(),以及收获harvest()。

这个水果接口的源代码如下所示:

 
  1. package com.wuyi.creationalPattern;

  2.  
  3. /**

  4. * Created on 2017/6/9

  5. *

  6. * @author WuYi

  7. */

  8. public interface Fruit {

  9. public void grow();

  10. public void harvest();

  11. public void plant();

  12. }

  13.  

Apple类是水果的一种,实现接口Fruit的所有方法。另外,由于苹果是多年生植物,因此多出一个treeAge性质,来描述苹果树的树龄。下面是这个Apple类的源代码

 
  1. package com.wuyi.creationalPattern;

  2.  
  3. /**

  4. * Created on 2017/6/9

  5. *

  6. * @author WuYi

  7. */

  8. public class Apple implements Fruit {

  9. private int treeAge;

  10.  
  11. public int getTreeAge() {

  12. return treeAge;

  13. }

  14.  
  15. public void setTreeAge(int treeAge) {

  16. this.treeAge = treeAge;

  17. }

  18.  
  19. @Override

  20. public void grow() {

  21. log("Apple is growing");

  22. }

  23.  
  24. @Override

  25. public void harvest() {

  26. log("Apple has been harvest");

  27. }

  28.  
  29. @Override

  30. public void plant() {

  31. log("Apple has been planted");

  32. }

  33. /**

  34. * 辅助方法

  35. */

  36. public static void log(String msg){

  37. System.out.println(msg);

  38. }

  39. }

同理,Grape类是水果的一种,但葡萄分为有籽和无籽两类,因此多出一个seedless属性。代码如下:

 
  1. package com.wuyi.creationalPattern;

  2.  
  3. /**

  4. * Created on 2017/6/9

  5. *

  6. * @author WuYi

  7. */

  8. public class Grape implements Fruit{

  9. private boolean seedless;

  10.  
  11. public boolean isSeedless() {

  12. return seedless;

  13. }

  14.  
  15. public void setSeedless(boolean seedless) {

  16. this.seedless = seedless;

  17. }

  18.  
  19. @Override

  20. public void grow() {

  21. log("Grape is growing");

  22. }

  23.  
  24. @Override

  25. public void harvest() {

  26. log("Grape has been harvested");

  27. }

  28.  
  29. @Override

  30. public void plant() {

  31. log("Grape has been planted");

  32. }

  33. /**

  34. * 辅助方法

  35. */

  36. public static void log(String msg){

  37. System.out.println(msg);

  38. }

  39. }

  40.  

Strawberry草莓类代码如下:

 
  1. package com.wuyi.creationalPattern;

  2.  
  3. /**

  4. * Created on 2017/6/9

  5. *

  6. * @author WuYi

  7. */

  8. public class Strawberry implements Fruit{

  9. @Override

  10. public void grow() {

  11. log("Strawberry is growing");

  12. }

  13.  
  14. @Override

  15. public void harvest() {

  16. log("Strawberry has been harvested");

  17. }

  18.  
  19. @Override

  20. public void plant() {

  21. log("Strawberry has been planted");

  22. }

  23. /**

  24. * 辅助方法

  25. */

  26. public static void log(String msg){

  27. System.out.println(msg);

  28. }

  29. }

农场的园丁也是系统的一部分,自然要由一个合适的类来代表。这个类就是FruitGardener类(就是我们的工厂类了),FruitGardener类根据客户端的要求,创建出不同的水果对象,比如苹果Apple,葡萄Grape或草莓Strawberry的实例,而如果收不到合法的要求,就会抛出BadFruitException异常。BadFruitException异常类代码如下:

 
  1. package com.wuyi.exception;

  2.  
  3. /**

  4. * Created on 2017/6/10

  5. *

  6. * @author WuYi

  7. */

  8. public class BadFruitException extends Exception{

  9. public BadFruitException(String msg){

  10. super(msg);

  11. }

  12. }

FruitGardener园丁类的代码如下:

 
  1. package com.wuyi.creationalPattern;

  2.  
  3. import com.wuyi.exception.BadFruitException;

  4. import com.wuyi.staticMethodTest.A;

  5.  
  6. /**

  7. * Created on 2017/6/9

  8. *

  9. * @author WuYi

  10. */

  11. public class FruitGardener {

  12. /**

  13. * 静态工厂方法

  14. *

  15. */

  16. public static Fruit factory(String which) throws BadFruitException {

  17. if (which.equalsIgnoreCase("apple")){

  18. return new Apple();

  19. }

  20. else if (which.equalsIgnoreCase("strawberry")){

  21. return new Strawberry();

  22. }

  23. else if (which.equalsIgnoreCase("grape")){

  24. return new Grape();

  25. }

  26. else {

  27. throw new BadFruitException("Bad fruit request");

  28. }

  29. }

  30. }

测试类代码如下:

 
  1. package com.wuyi.creationalPattern;

  2.  
  3. import com.wuyi.exception.BadFruitException;

  4.  
  5. /**

  6. * Created on 2017/6/10

  7. *

  8. * @author WuYi

  9. */

  10. public class FactoryTest {

  11. public static void main(String[] args) {

  12. try {

  13. Fruit apple = FruitGardener.factory("apple");

  14. Fruit grape=FruitGardener.factory("grape");

  15. Fruit strawBerry=FruitGardener.factory("strawberry");

  16. apple.grow();

  17. grape.grow();

  18. strawBerry.grow();

  19. } catch (BadFruitException e) {

  20. e.printStackTrace();

  21. }

  22. }

  23. }

结果输出:

 
  1. "D:\Java JDK1.7\bin\java" "-javaagent:D:\Idea\IntelliJ IDEA 2017.1\lib\idea_rt.jar=9689:D:\Idea\IntelliJ IDEA 2017.1\bin" -Dfile.encoding=UTF-8 -classpath "D:\Java JDK1.7\jre\lib\charsets.jar;D:\Java JDK1.7\jre\lib\deploy.jar;D:\Java JDK1.7\jre\lib\ext\access-bridge-64.jar;D:\Java JDK1.7\jre\lib\ext\dnsns.jar;D:\Java JDK1.7\jre\lib\ext\jaccess.jar;D:\Java JDK1.7\jre\lib\ext\localedata.jar;D:\Java JDK1.7\jre\lib\ext\sunec.jar;D:\Java JDK1.7\jre\lib\ext\sunjce_provider.jar;D:\Java JDK1.7\jre\lib\ext\sunmscapi.jar;D:\Java JDK1.7\jre\lib\ext\zipfs.jar;D:\Java JDK1.7\jre\lib\javaws.jar;D:\Java JDK1.7\jre\lib\jce.jar;D:\Java JDK1.7\jre\lib\jfr.jar;D:\Java JDK1.7\jre\lib\jfxrt.jar;D:\Java JDK1.7\jre\lib\jsse.jar;D:\Java JDK1.7\jre\lib\management-agent.jar;D:\Java JDK1.7\jre\lib\plugin.jar;D:\Java JDK1.7\jre\lib\resources.jar;D:\Java JDK1.7\jre\lib\rt.jar;D:\Idea\Idea WorkSpace\Design_Principles_and_Patterns_In_Java\out\production\Design_Principles_and_Patterns_In_Java" com.wuyi.creationalPattern.FactoryTest

  2. Apple is growing

  3. Grape is growing

  4. Strawberry is growing

  5.  
  6. Process finished with exit code 0

简单工厂模式是类的创建模式,这个模式的一般性结构如下图所示:

--------------------- 本文来自 Wsky51 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/Wsky51/article/details/72972691?utm_source=copy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值