设计模式:工厂模式(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("");}}?运行结果:
这是一个热带水果
?
?
?
工厂模式:
模式运用最重要的是思想:简单工厂模式适合一个对象,方法模式适合一个品种,抽象模式适合一个系列,也就是它们分别是按对象、种类、系列(群体)来划分的