java工厂模式简单实例

java中工厂模式在java ee中经常碰见,是一种常见的模式,其可分为三种:静态工厂模式、工厂方法模式、抽象工厂模式。一下做一简单讲述和例子。

静态工厂模式:顾名思义就知道他是用静态方法实现的,其创建的对象具有一定的特性,譬如说是某类的派生或者某接口的实现。其比较简单。例子如下

Animal类:

Java代码 收藏代码
  1. package com.bean;
  2. /**
  3. * 动物类
  4. * @author Lyon Yao
  5. *
  6. */
  7. public abstract class Animal {
  8. private String name;
  9. public Animal() {
  10. super();
  11. // TODO Auto-generated constructor stub
  12. }
  13. public Animal(String name) {
  14. super();
  15. this.name = name;
  16. }
  17. public abstract void eat();
  18. public String getName() {
  19. return name;
  20. }
  21. public void setName(String name) {
  22. this.name = name;
  23. }
  24. }

猫类:

Java代码 收藏代码
  1. package com.bean;
  2. /**
  3. * 猫类
  4. * @author Lyon Yao
  5. *
  6. */
  7. public class Cat extends Animal {
  8. public Cat() {
  9. // TODO Auto-generated constructor stub
  10. }
  11. public Cat(String name) {
  12. super(name);
  13. // TODO Auto-generated constructor stub
  14. }
  15. @Override
  16. public void eat() {
  17. // TODO Auto-generated method stub
  18. System.out.println("I like to eat fish!");
  19. }
  20. }

狗类:package com.bean;

Java代码 收藏代码
  1. /**
  2. * 狗类
  3. * @author Lyon Yao
  4. *
  5. */
  6. public class Dog extends Animal {
  7. public Dog() {
  8. // TODO Auto-generated constructor stub
  9. }
  10. public Dog(String name) {
  11. super(name);
  12. // TODO Auto-generated constructor stub
  13. }
  14. @Override
  15. public void eat() {
  16. // TODO Auto-generated method stub
  17. System.out.println("I like to eat bone!");
  18. }
  19. }

静态工厂类:

Java代码 收藏代码
  1. package com.factory.sta;
  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.InvocationTargetException;
  4. /**
  5. * 静态工厂创建一个对象 静态工厂类产生的对象一般都有共同的特性,继承某一类,或者引用接口之类,在此
  6. * 没有看似没有,但不可否认他们都是Object或者Object的一个子类
  7. * @author Lyon Yao
  8. *
  9. */
  10. public class StaticFatory {
  11. public static Object getInstance(String className){
  12. Object instance=null;
  13. try {
  14. Class cls=Class.forName(className);
  15. instance= cls.newInstance();
  16. } catch (ClassNotFoundException e) {
  17. // TODO Auto-generated catch block
  18. e.printStackTrace();
  19. } catch (InstantiationException e) {
  20. // TODO Auto-generated catch block
  21. e.printStackTrace();
  22. } catch (IllegalAccessException e) {
  23. // TODO Auto-generated catch block
  24. e.printStackTrace();
  25. }
  26. return instance;
  27. }
  28. public static Object getInstance(String className,Object ...agrs) {
  29. Class cls=null;
  30. try {
  31. cls = Class.forName(className);
  32. } catch (ClassNotFoundException e1) {
  33. // TODO Auto-generated catch block
  34. return null;
  35. }
  36. Constructor[] constructors = cls.getConstructors();
  37. Object instance=null;
  38. for(Constructor cons:constructors){
  39. Class <?>[] clses=cons.getParameterTypes();
  40. if(clses.length>0){
  41. boolean isThisConstructor=true;
  42. for(int i=0;i<clses.length;i++){
  43. Class c=clses[i];
  44. if(! c.isInstance(agrs[i]) ){
  45. isThisConstructor=false;
  46. }
  47. }
  48. if(isThisConstructor){
  49. try {
  50. instance=cons.newInstance(agrs);
  51. break;
  52. } catch (IllegalArgumentException e) {
  53. // TODO Auto-generated catch block
  54. e.printStackTrace();
  55. } catch (InvocationTargetException e) {
  56. // TODO Auto-generated catch block
  57. e.printStackTrace();
  58. } catch (InstantiationException e) {
  59. // TODO Auto-generated catch block
  60. e.printStackTrace();
  61. } catch (IllegalAccessException e) {
  62. // TODO Auto-generated catch block
  63. e.printStackTrace();
  64. }
  65. }else{
  66. continue;
  67. }
  68. }
  69. }
  70. return instance;
  71. }
  72. }

工厂方法模式:其主要是对各个类型的东西分类生产,但分类生产的对象仍然是具有某一特性的。譬如说:前面的静态工厂类是一个综合造车工厂,不管是汽车还是火车都能生产,而工厂方法模式就是工厂具体分工,造汽车的工厂只造汽车,造火车的只造火车,不管造汽车还是火车但造出来的还是车。

具体代码例子如下:(这里的例子和上面的例子是一起的,具狗生好多小狗,猫生好多小猫的例子,如果不具体那么是母动物都能生的)

母动物接口:

Java代码 收藏代码
  1. package com.factory;
  2. import com.bean.Animal;
  3. /**
  4. * 母亲接口
  5. * @author Lyon
  6. *
  7. */
  8. public interface AnimalMother {
  9. /**
  10. * 生育动物
  11. * @return
  12. */
  13. public Animal giveBirth();
  14. }

母狗类:

Java代码 收藏代码
  1. package com.factory.impl;
  2. import com.bean.Animal;
  3. import com.bean.Dog;
  4. import com.factory.AnimalMother;
  5. /**
  6. * 狗母亲 生狗
  7. * @author Lyon Yao
  8. *
  9. */
  10. public class DogMother implements AnimalMother {
  11. @Override
  12. public Animal giveBirth() {
  13. // TODO Auto-generated method stub
  14. Animal dog=new Dog();
  15. System.out.println("狗母亲生了一只小狗");
  16. return dog;
  17. }
  18. }

母猫类:

Java代码 收藏代码
  1. package com.factory.impl;
  2. import com.bean.Animal;
  3. import com.bean.Cat;
  4. import com.factory.AnimalMother;
  5. /**
  6. * 猫母亲 生猫咪
  7. * @author Lyon Yao
  8. *
  9. */
  10. public class CatMother implements AnimalMother {
  11. @Override
  12. public Animal giveBirth() {
  13. // TODO Auto-generated method stub
  14. Animal cat=new Cat();
  15. System.out.println("猫母亲生了一只小猫眯");
  16. return cat;
  17. }
  18. }

抽象工厂模式:前面工厂方法模式是比较具体的,是猫肯定生的是小猫,这是不会有问题的,是具体的,那么抽象工厂它所产生的就不是那么具体,产生的对象可能是没有共同特性的。譬如说 一只奶羊不仅仅能够生小羊,同时也能生产羊奶,但小羊是动物,羊奶是食物。

例子如下:

总工厂:

Java代码 收藏代码
  1. package com.factory;
  2. import com.bean.Milk;
  3. /**
  4. * 能产奶的 动物母亲
  5. * 这里继承 AnimalMother 实现 生育小动物 产奶在此接口声明 构成抽象工厂总接口
  6. * @author Lyon Yao
  7. *
  8. */
  9. public interface MilkAnimalMother extends AnimalMother {
  10. /**
  11. * 产奶
  12. * @return
  13. */
  14. public Milk produceMilk();
  15. }

奶羊:

Java代码 收藏代码
  1. package com.factory.impl;
  2. import com.bean.Animal;
  3. import com.bean.Milk;
  4. import com.bean.Sheep;
  5. import com.bean.SheepMilk;
  6. import com.factory.MilkAnimalMother;
  7. /**
  8. * 奶羊
  9. * @author Lyon Yao
  10. *
  11. */
  12. public class SheepMilkMother implements MilkAnimalMother{
  13. @Override
  14. public Animal giveBirth() {
  15. // TODO Auto-generated method stub
  16. Animal sheep=new Sheep();
  17. System.out.println("奶羊生了一只小羊");
  18. return sheep;
  19. }
  20. @Override
  21. public Milk produceMilk() {
  22. // TODO Auto-generated method stub
  23. Milk milk=new SheepMilk();
  24. System.out.println("奶羊生产了羊奶");
  25. return milk;
  26. }
  27. }

奶牛:

Java代码 收藏代码
  1. package com.factory.impl;
  2. import com.bean.Animal;
  3. import com.bean.Cattle;
  4. import com.bean.CattleMile;
  5. import com.bean.Milk;
  6. import com.factory.MilkAnimalMother;
  7. /**
  8. * 奶牛()
  9. * @author Lyon Yao
  10. *
  11. */
  12. public class CattleMilkMother implements MilkAnimalMother {
  13. @Override
  14. public Animal giveBirth() {
  15. // TODO Auto-generated method stub
  16. Cattle cattle=new Cattle();
  17. System.out.println("奶牛生了一只小牛");
  18. return cattle;
  19. }
  20. @Override
  21. public Milk produceMilk() {
  22. // TODO Auto-generated method stub
  23. Milk milk=new CattleMile();
  24. System.out.println("奶牛生产了牛奶");
  25. return milk;
  26. }
  27. }

下面是测试例子:

Java代码 收藏代码
  1. package com.test;
  2. import org.junit.Test;
  3. import com.bean.Animal;
  4. import com.bean.Cat;
  5. import com.bean.Dog;
  6. import com.factory.AnimalMother;
  7. import com.factory.MilkAnimalMother;
  8. import com.factory.impl.CatMother;
  9. import com.factory.impl.CattleMilkMother;
  10. import com.factory.impl.DogMother;
  11. import com.factory.impl.SheepMilkMother;
  12. import com.factory.sta.StaticFatory;
  13. /**
  14. * 测试类
  15. *
  16. * @author Lyon Yao
  17. *
  18. */
  19. public class TestCase {
  20. /**
  21. * 静态工厂类 测试
  22. */
  23. @Test
  24. public void staticFactoryTest() {
  25. Animal ani1=(Animal) StaticFatory.getInstance(Cat.class.getName());
  26. System.out.println(ani1.getName());
  27. ani1.eat();
  28. ani1=(Animal) StaticFatory.getInstance(Dog.class.getName(),"dog");
  29. System.out.println(ani1.getName());
  30. ani1.eat();
  31. }
  32. /**
  33. * 工厂方法模式测试
  34. */
  35. @Test
  36. public void methodFactoryTest(){
  37. AnimalMother mother=new CatMother();
  38. mother.giveBirth();
  39. mother=new DogMother();
  40. mother.giveBirth();
  41. }
  42. /**
  43. * 抽象工厂模式测试
  44. */
  45. @Test
  46. public void abstrFactoryTest(){
  47. MilkAnimalMother mother=new SheepMilkMother();
  48. mother.giveBirth();
  49. mother.produceMilk();
  50. mother=new CattleMilkMother();
  51. mother.giveBirth();
  52. mother.produceMilk();
  53. }
  54. }

控制台输出:

null

I like to eat fish!

dog

I like to eat bone!

猫母亲生了一只小猫眯

狗母亲生了一只小狗

奶羊生了一只小羊

奶羊生产了羊奶

奶牛生了一只小牛

奶牛生产了牛奶

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值