设计模式

来源:互联网 发布:网络搜索引擎市场份额 编辑:程序博客网 时间:2024/05/21 09:44

设计模式之简单工厂模式

简单工厂模式旨在使对象的创建和使用相分离,客户端不再负责对象的创建,而是把责任丢给一个专门负责创建对象的工厂。

例如,对于一个动物园管理程序,需要管理许多不同的动物,因此可以设计如下。

首先创建一个Animal接口,描述所有动物的共性。

package com.design;public interface Animal {//所有动物都会吃public void eat();}
然后不同的动物分别实现这个接口,并添加自己的特性

package com.design;public class Bird implements Animal{//鸟会吃public void eat() {System.out.println("鸟在吃");}//鸟会飞public void fly() {System.out.println("鸟在飞");}}
package com.design;public class Cat implements Animal{//猫会吃public void eat(){System.out.println("猫在吃");}//猫会跳public void jump(){System.out.println("猫在跳");}}

package com.design;public class AnimalFactory {public static Animal createAnimal(String animalName){Animal animal = null;try {animal=(Animal) Class.forName(animalName).newInstance();} catch (ClassNotFoundException e) {System.out.println("找不到");} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}return animal;}}
最后客户端就可以简单的使用不同的动物了

package com.design;public class SimpleClient {public static void main(String[]args){Cat cat=(Cat) AnimalFactory.createAnimal("com.design.Cat");cat.eat();cat.jump();Bird bird=(Bird) AnimalFactory.createAnimal("com.design.Bird");bird.eat();bird.fly();}}

运行结果:

猫在吃
猫在跳
鸟在吃
鸟在飞


设计模式之工厂模式

前面的简单工厂模式虽然在一定程度上使使用对象与创建对象分离,但是由于只有一个工厂,因此假如对象过多并且每个对象的初始化很复杂的话,那么这个工厂将会显的很臃肿不利于维护,因此,工厂模式对于每种对象分配一个工厂,更加细化了责任。

修改上面的例子

Animal接口以及具体实现类不变,创建一个Factory声明创建对象的方法

package com.design;public interface Factory {public Animal createAnimal();}

然后不同的动物工厂实现这个接口

package com.design;public class BirdFactory implements Factory{public Animal createAnimal() {return new Bird();}}

package com.design;public class CatFactory implements Factory{public Animal createAnimal(){return new Cat();}}

最后客户端调用如下

package com.design;public class SimpleClient {public static void main(String[]args){Cat cat=(Cat)new CatFactory().createAnimal();cat.eat();cat.jump();Bird bird=(Bird)new BirdFactory().createAnimal();bird.eat();bird.fly();}}

运行结果同上