设计模式学习笔记之抽象工厂设计模式
来源:互联网 发布:ubuntu新建文件 不能 编辑:程序博客网 时间:2024/04/29 11:38
抽象工厂,是提供一组接口,而不考虑实现。
比如我们有两个接口,IUser和IClass,负责往数据库里面添加信息。然后有OracleUser和OracleClass,负责往Oracle的数据库中添加信息。然后有SqlserverUser和SqlserverClass,负责往Sql server数据库中添加信息。那么,就需要一个抽象工厂,返回用户所需要的具体对象。
我们用properties来储存dbName信息,从而达到一修改即全修改的效果。不用if...else...语句进行判断,然后返回,而是用java的反射技术进行返回,从而达到最大限度的减少代码量的目的。
首先,是定义两个接口:
package AbstractFactory;public interface IClass {public void addClass(); public void deleteClass();public void modifyClass();}
package AbstractFactory;public interface IUser {public void addUser();public void deleteUser();public void modifyUser();}
再就是,定义4个实现类:
package AbstractFactory;public class OracleClass implements IClass{public void addClass() {System.out.println("Oracle add Class");}public void deleteClass() {System.out.println("Oracle delete Class");}public void modifyClass() {System.out.println("Oracle modify Class");}}
package AbstractFactory;public class SqlserverClass implements IClass{public void addClass() {System.out.println("Sql server add Class");}public void deleteClass() {System.out.println("Sql server delete Class");}public void modifyClass() {System.out.println("Sql server modify Class");}}
package AbstractFactory;public class OracleUser implements IUser{public void addUser() {System.out.println("Oracle add User");}public void deleteUser() {System.out.println("Oracle delete User");}public void modifyUser() {System.out.println("Oracle modify User");}}
package AbstractFactory;public class SqlserverUser implements IUser{public void addUser() {System.out.println("Sql server add User");}public void deleteUser() {System.out.println("Sql server delete User");}public void modifyUser() {System.out.println("Sql server modify User");}}
然后,就是最为关键的抽象工厂类:
package AbstractFactory;import java.io.IOException;import java.util.Properties;public class AbstractFactory {private String name;public AbstractFactory(){//从Properties文件读取Properties property = new Properties();try {property.load(AbstractFactory.class.getResourceAsStream("AbstractFactory.properties"));this.name = property.getProperty("dbName");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public IUser getUser(){try {return (IUser) Class.forName("AbstractFactory."+name+"User").newInstance();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}public IClass getClass1() {try {return (IClass) Class.forName("AbstractFactory."+name+"Class").newInstance();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}}
测试抽象工厂的类:
package AbstractFactory;public class AbstractFactoryTest {public static void main(String[] args){AbstractFactory factory = new AbstractFactory();IUser user = factory.getUser();user.addUser();user.deleteUser();user.modifyUser();IClass iclass = factory.getClass1();iclass.addClass();iclass.deleteClass();iclass.modifyClass();}}
最后,就是对properties文件的定义:
dbName=Sqlserver
运行结果为:
Sql server add User
Sql server delete User
Sql server modify User
Sql server add Class
Sql server delete Class
Sql server modify Class
其实,我倒没觉得抽象工厂有多巧妙。但是,和Java的反射技术配合到一起,那真是绝妙啊。
- 设计模式学习笔记之抽象工厂设计模式
- 设计模式学习笔记-抽象工厂模式
- 设计模式学习笔记--抽象工厂模式
- 设计模式学习笔记-抽象工厂模式
- 设计模式笔记之---抽象工厂模式
- 《设计模式》笔记之抽象工厂模式
- 设计模式之--抽象工厂模式(学习分析笔记)
- Java学习笔记---设计模式之抽象工厂模式
- 设计模式之抽象工厂模式学习
- 学习设计模式之“抽象工厂模式”
- 设计模式学习笔记(4)抽象工厂
- C#设计模式学习笔记-抽象工厂
- java设计模式笔记之抽象工厂
- 设计模式学习之抽象工厂
- 设计模式笔记之工厂模式--抽象工厂(Abstract Factory)
- 设计模式之-抽象工厂设计模式
- 设计模式之抽象工厂设计模式
- 设计模式学习之简单工厂、工厂方法、抽象工厂
- RGBA
- 《花开半夏》--2 消息,魏如风(1)
- ASP.NET 中如何在使用Eval()绑定数据时使用三元运算符
- Android™ 2.1 android.R.drawable Icon Resources
- 人臉表情識別綜述
- 设计模式学习笔记之抽象工厂设计模式
- Caliburn Micro
- ERWin 7 下载地址和注册码
- 今天新学内容知识
- 《花开半夏》--2 消息,魏如风(2)
- Struts2.0 图片的上传与下载的实现
- Windows2003服务器不支持FLV视频的解决方法
- ”No previous prototype for function “warning警告错误
- 《花开半夏》--3 调查(1)