java中工厂模式在java ee中常常遇见,是一种常见的模式,其可分为三种:静态工厂模式、工厂方法模式、抽象工厂模式。一下作一简单讲述和例子。java
静态工厂模式:顾名思义就知道他是用静态方法实现的,其建立的对象具备必定的特性,譬如说是某类的派生或者某接口的实现。其比较简单。例子以下ide
Animal类:测试
package com.bean; /** * 动物类 * @author Lyon Yao * */ public abstract class Animal { private String name; public Animal() { super(); // TODO Auto-generated constructor stub } public Animal(String name) { super(); this.name = name; } public abstract void eat(); public String getName() { return name; } public void setName(String name) { this.name = name; } }
猫类:this
package com.bean; /** * 猫类 * @author Lyon Yao * */ public class Cat extends Animal { public Cat() { // TODO Auto-generated constructor stub } public Cat(String name) { super(name); // TODO Auto-generated constructor stub } @Override public void eat() { // TODO Auto-generated method stub System.out.println("I like to eat fish!"); } }
狗类:package com.bean;spa
/** * 狗类 * @author Lyon Yao * */ public class Dog extends Animal { public Dog() { // TODO Auto-generated constructor stub } public Dog(String name) { super(name); // TODO Auto-generated constructor stub } @Override public void eat() { // TODO Auto-generated method stub System.out.println("I like to eat bone!"); } }
静态工厂类:orm
package com.factory.sta; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; /** * 静态工厂建立一个对象 静态工厂类产生的对象通常都有共同的特性,继承某一类,或者引用接口之类,在此 * 没有看似没有,但不能否认他们都是Object或者Object的一个子类 * @author Lyon Yao * */ public class StaticFatory { public static Object getInstance(String className){ Object instance=null; try { Class cls=Class.forName(className); instance= cls.newInstance(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } return instance; } public static Object getInstance(String className,Object ...agrs) { Class cls=null; try { cls = Class.forName(className); } catch (ClassNotFoundException e1) { // TODO Auto-generated catch block return null; } Constructor[] constructors = cls.getConstructors(); Object instance=null; for(Constructor cons:constructors){ Class <?>[] clses=cons.getParameterTypes(); if(clses.length>0){ boolean isThisConstructor=true; for(int i=0;i<clses.length;i++){ Class c=clses[i]; if(! c.isInstance(agrs[i]) ){ isThisConstructor=false; } } if(isThisConstructor){ try { instance=cons.newInstance(agrs); break; } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ continue; } } } return instance; } }
工厂方法模式:其主要是对各个类型的东西分类生产,但分类生产的对象仍然是具备某一特性的。譬如说:前面的静态工厂类是一个综合造车工厂,无论是汽车仍是火车都能生产,而工厂方法模式就是工厂具体分工,造汽车的工厂只造汽车,造火车的只造火车,无论造汽车仍是火车但造出来的仍是车。对象
具体代码例子以下:(这里的例子和上面的例子是一块儿的,具狗生好多小狗,猫生好多小猫的例子,若是不具体那么是母动物都能生的)继承
母动物接口:接口
package com.factory; import com.bean.Animal; /** * 母亲接口 * @author Lyon * */ public interface AnimalMother { /** * 生育动物 * @return */ public Animal giveBirth(); }
母狗类:get
package com.factory.impl; import com.bean.Animal; import com.bean.Dog; import com.factory.AnimalMother; /** * 狗母亲 生狗 * @author Lyon Yao * */ public class DogMother implements AnimalMother { @Override public Animal giveBirth() { // TODO Auto-generated method stub Animal dog=new Dog(); System.out.println("狗母亲生了一只小狗"); return dog; } }
母猫类:
package com.factory.impl; import com.bean.Animal; import com.bean.Cat; import com.factory.AnimalMother; /** * 猫母亲 生猫咪 * @author Lyon Yao * */ public class CatMother implements AnimalMother { @Override public Animal giveBirth() { // TODO Auto-generated method stub Animal cat=new Cat(); System.out.println("猫母亲生了一只小猫眯"); return cat; } }
抽象工厂模式:前面工厂方法模式是比较具体的,是猫确定生的是小猫,这是不会有问题的,是具体的,那么抽象工厂它所产生的就不是那么具体,产生的对象多是没有共同特性的。譬如说 一只奶羊不单单可以生小羊,同时也能生产羊奶,但小羊是动物,羊奶是食物。
例子以下:
总工厂:
package com.factory; import com.bean.Milk; /** * 能产奶的 动物母亲 * 这里继承 AnimalMother 实现 生育小动物 产奶在此接口声明 构成抽象工厂总接口 * @author Lyon Yao * */ public interface MilkAnimalMother extends AnimalMother { /** * 产奶 * @return */ public Milk produceMilk(); }
奶羊:
package com.factory.impl; import com.bean.Animal; import com.bean.Milk; import com.bean.Sheep; import com.bean.SheepMilk; import com.factory.MilkAnimalMother; /** * 奶羊 * @author Lyon Yao * */ public class SheepMilkMother implements MilkAnimalMother{ @Override public Animal giveBirth() { // TODO Auto-generated method stub Animal sheep=new Sheep(); System.out.println("奶羊生了一只小羊"); return sheep; } @Override public Milk produceMilk() { // TODO Auto-generated method stub Milk milk=new SheepMilk(); System.out.println("奶羊生产了羊奶"); return milk; } }
奶牛:
package com.factory.impl; import com.bean.Animal; import com.bean.Cattle; import com.bean.CattleMile; import com.bean.Milk; import com.factory.MilkAnimalMother; /** * 奶牛() * @author Lyon Yao * */ public class CattleMilkMother implements MilkAnimalMother { @Override public Animal giveBirth() { // TODO Auto-generated method stub Cattle cattle=new Cattle(); System.out.println("奶牛生了一只小牛"); return cattle; } @Override public Milk produceMilk() { // TODO Auto-generated method stub Milk milk=new CattleMile(); System.out.println("奶牛生产了牛奶"); return milk; } }
下面是测试例子:
package com.test; import org.junit.Test; import com.bean.Animal; import com.bean.Cat; import com.bean.Dog; import com.factory.AnimalMother; import com.factory.MilkAnimalMother; import com.factory.impl.CatMother; import com.factory.impl.CattleMilkMother; import com.factory.impl.DogMother; import com.factory.impl.SheepMilkMother; import com.factory.sta.StaticFatory; /** * 测试类 * * @author Lyon Yao * */ public class TestCase { /** * 静态工厂类 测试 */ @Test public void staticFactoryTest() { Animal ani1=(Animal) StaticFatory.getInstance(Cat.class.getName()); System.out.println(ani1.getName()); ani1.eat(); ani1=(Animal) StaticFatory.getInstance(Dog.class.getName(),"dog"); System.out.println(ani1.getName()); ani1.eat(); } /** * 工厂方法模式测试 */ @Test public void methodFactoryTest(){ AnimalMother mother=new CatMother(); mother.giveBirth(); mother=new DogMother(); mother.giveBirth(); } /** * 抽象工厂模式测试 */ @Test public void abstrFactoryTest(){ MilkAnimalMother mother=new SheepMilkMother(); mother.giveBirth(); mother.produceMilk(); mother=new CattleMilkMother(); mother.giveBirth(); mother.produceMilk(); } }
控制台输出:
null
I like to eat fish!
dog
I like to eat bone!
猫母亲生了一只小猫眯
狗母亲生了一只小狗
奶羊生了一只小羊
奶羊生产了羊奶
奶牛生了一只小牛
奶牛生产了牛奶