首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

设计形式:工厂模式(Factory Pattern)

2012-08-10 
设计模式:工厂模式(Factory Pattern)一、工厂模式之简单工厂模式Simple Factory Pattern工厂模式,Spring用

设计模式:工厂模式(Factory Pattern)

一、工厂模式之简单工厂模式Simple Factory Pattern

工厂模式,Spring用的比较多

1>我们新建一个Dao接口

?

package com.kaishengit.factory.simple;public interface Dao {public void save();}

?

?接下来我们新建两个实现类:

1.MySqlDao.java

?

package com.kaishengit.factory.simple;public class MySqlDao implements Dao{@Overridepublic void save() {System.out.println("使用MySql存储数据!");}}

?2.OracleDao.java?

?

package com.kaishengit.factory.simple;public class OracleDao implements Dao{@Overridepublic void save() {System.out.println("使用Oracle存储数据!");}}

?

?2>1.我们在源文件夹中新建一个配置文件bean.properties

?

#key=beanNameoracleDao=com.kaishengit.factory.simple.OracleDaomySqlDao=com.kaishengit.factory.simple.MySqlDao

?

2.接下来 我们新建一个工厂BeanFactory.java

?

package com.kaishengit.factory.simple;import java.io.IOException;import java.util.Properties;public class BeanFactory {private BeanFactory(){}private static Properties pro;static{pro = new Properties();try {pro.load(BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties"));} catch (IOException e) {e.printStackTrace();}}public static Object getBean(String beanName){if(pro.containsKey(beanName)){String className = pro.getProperty(beanName);try {return Class.forName(className).newInstance();} catch (Exception e) {e.printStackTrace();}}return null;}}
?

?

3>我们测试一下

Test

?

package com.kaishengit.factory.simple;public class Test {public static void main(String[] args) {Dao dao = (Dao) BeanFactory.getBean("mySqlDao");dao.save();}}

?

?运行结果:

使用MySql存储数据!

?

如果我们把beanName换成oracleDao,则运行结果为→使用Oracle存储数据!

...ok...

?

二、工厂模式之工厂方法模式(Factory Method)

?

工厂方法模式定义了一个创建对象的接口,但由子类(实现类)决定要实例化的类是

哪一个。工厂方法让类把实例化推迟到子类(实现类)。

?

?

这里我们以水果种类为例

1>我们新建一个Fruit接口和一个FruitFactory接口

?

package com.kaishengit.factory.method;public interface Fruit {public void plant();public void grow();public void harvest();}

?

?

?

package com.kaishengit.factory.method;public interface FruitFactory {public Fruit createFruit(String type);//根据水果种类划分,例如:苹果、橘子...}

?

?2>1.这里我们只新建一个AppleFactory:实现FruitFactory接口

?

package com.kaishengit.factory.method;public class AppleFactory implements FruitFactory{@Overridepublic Fruit createFruit(String type) {if("hongfushi".equals(type)){return new HongfushiApple();}return null;}}

?

?2.我们只新建苹果中的一种品种:HongfushiApple:实现Fruit接口

?

package com.kaishengit.factory.method;public class HongfushiApple implements Fruit{@Overridepublic void plant() {System.out.println("种植红富士");}@Overridepublic void grow() {}@Overridepublic void harvest() {}}
?

?

3>接下来我们测试一下:

?

package com.kaishengit.factory.method;public class Test {public static void main(String[] args) {FruitFactory ff = new AppleFactory();Fruit f = ff.createFruit("hongfushi");f.plant();}}

?

?运行结果:

种植红富士

?

...ok...,方法模式的精髓:根据种类划分,像这里是根据水果种类划分的

?

三、工厂模式之抽象工厂(Abstract Factory)

抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

这种模式是根据系列划分的,这里我们把水果分为:热带系列和亚热带系列,我们只写一下热带系列

?

1>我们新建三个接口:Fruit、Veggie、Factory

?

package com.kaishengit.factory.abstract_p;public interface Fruit {}

?

?

?

package com.kaishengit.factory.abstract_p;public interface Veggie {}

?

?

?

package com.kaishengit.factory.abstract_p;public interface Factory {public Fruit createFruit(String type);public Veggie createVeggie(String type);}

?

?

2>我们新建一个热带工厂(TropicalFactory)、一个热带水果(TropicalFruit)

package com.kaishengit.factory.abstract_p;public class TropicalFactory implements Factory{@Overridepublic Fruit createFruit(String type) {return new TropicalFruit();}@Overridepublic Veggie createVeggie(String type) {return null;}}

?

package com.kaishengit.factory.abstract_p;public class TropicalFruit implements Fruit{public TropicalFruit() {System.out.println("这是一个热带水果");}}

?

3>最后我们测试一下:

package com.kaishengit.factory.abstract_p;public class Test {public static void main(String[] args) {Factory factory = new TropicalFactory();factory.createFruit("");}}
?

运行结果:

这是一个热带水果

?

?

?

工厂模式:

模式运用最重要的是思想:简单工厂模式适合一个对象,方法模式适合一个品种,抽象模式适合一个系列,也就是它们分别是按对象、种类、系列(群体)来划分的

热点排行