- 浏览: 351626 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (160)
- webservice (2)
- 数据库开发 (9)
- LINUX (6)
- 团队协作 (5)
- 前端技术 (4)
- J2EE (31)
- web服务器 (9)
- 经验常识 (12)
- 开发工具 (17)
- 项目管理 (7)
- 重构与设计模式 (8)
- 安全技术 (1)
- 并发编程 (1)
- 移动互联网 (2)
- 编码风格 (1)
- 领域建模 (1)
- 随想杂记 (12)
- 翻译 (2)
- 问题排查 (2)
- 数据挖掘 (4)
- 软件架构 (1)
- java语言基础知识 (13)
- 文件读写 (1)
- mac研发笔记 (1)
- 网络问题 (1)
- python学习 (0)
- Java8新特性 (1)
- soft kes collections (1)
最新评论
-
cremains:
...
java8新特性学习笔记 -
bingyingao:
guooo 写道很好的总结,不知能否转载?可以,多谢关注
又四年了,再看如何快速融入一个新团队 -
guooo:
很好的总结,不知能否转载?
又四年了,再看如何快速融入一个新团队 -
omeweb:
又过了好几年了,有啥新感悟没有?
两年已过去,再看该如何快速融入新团队 -
kely39:
感谢楼主,问题已解决
包冲突问题的解决方法
下面是一个典型的工厂方法模式:
在此基础上,假如系统中又要创建植物系列对象,则实现抽象工厂模式如下:
JDK中体现:Collection.iterator方法
但是上面这种情况下,植物系列与动物系列的行为不是一样的,到底适合用抽象工厂模式吗?
----------------------------------------------------------
而下面一种方式,应该是最适合于使用抽象工厂模式的。
解决跨数据库的功能,用到抽象工厂模式.用于创建多系列化的对象(如Orale系列,MySql系列)
JDK中体现:
(1)java.sql包
(2)UIManager(swing外观)
package com; import java.util.Properties; /** * 动物接口,所有的具体动物类均需要继承此接口 * @author abing * */ interface Animal { void eat(); void sleep(); } /** * 动物子类老虎 * @author abing * */ class Tiger implements Animal { @Override public void eat() { System.out.println("老虎要吃饭..."); } @Override public void sleep() { System.out.println("老虎要睡觉..."); } } /** * 动物子类狼 * @author abing * */ class Walf implements Animal { @Override public void eat() { System.out.println("狼要吃饭..."); } @Override public void sleep() { System.out.println("狼要睡觉..."); } } /** * 工厂方法类 * @author abing * */ class AnimalFactory { /** * 根具传入参数创建相应的子类 * @param type * @return * @throws Exception */ public Animal createAnimal(String type) throws Exception { Animal animal = (Animal) Class.forName(type).newInstance();//创建动物子类,用反射的方式避免此处代码的修改 return animal; } } /** * 测试类 * @author abing * */ public class FactoryMethod { static Properties properties = new Properties(); /** * 这部分可以写在配置文件里面,每当新扩展一个子类,只用修改配置文件即可 */ static { properties.setProperty("t", "com.Tiger"); properties.setProperty("w", "com.Walf"); } public static void main(String[] args) throws Exception { String type = "w"; AnimalFactory animalFactory = new AnimalFactory(); Animal animal = animalFactory.createAnimal(properties.getProperty(type)); animal.eat(); animal.sleep(); } }
在此基础上,假如系统中又要创建植物系列对象,则实现抽象工厂模式如下:
package com.koubei.demo2; import java.util.Properties; /** * 动物接口,所有的具体动物类均需要继承此接口 * @author abing * */ interface Animal { void eat(); void sleep(); } /** * 动物子类老虎 * @author abing * */ class Tiger implements Animal { @Override public void eat() { System.out.println("老虎要吃饭..."); } @Override public void sleep() { System.out.println("老虎要睡觉..."); } } /** * 动物子类狼 * @author abing * */ class Walf implements Animal { @Override public void eat() { System.out.println("狼要吃饭..."); } @Override public void sleep() { System.out.println("狼要睡觉..."); } } /** * 植物接口,所有的具体植物类均需要继承此接口 * @author abing * */ interface Plant { /** * 植物生长 */ void grow(); /** * 植物开花 */ void flower(); } class SunFlower implements Plant{ @Override public void flower() { System.out.println("向日葵要开花..."); } @Override public void grow() { System.out.println("向日葵要生长..."); } } class Pumpkin implements Plant{ @Override public void flower() { System.out.println("南瓜要开花..."); } @Override public void grow() { System.out.println("南瓜要生长..."); } } /** * 动物工厂方法类 * @author abing * */ class AnimalFactory extends AbstractFactory{ /** * 根具传入参数创建相应的动物子类 * @param type * @return * @throws Exception */ public Animal createAnimal(String type) throws Exception { Animal animal = (Animal) Class.forName(type).newInstance();//创建动物子类,用反射的方式避免此处代码的修改 return animal; } @Override Plant createPlant(String type) throws Exception { // TODO Auto-generated method stub return null; } } /** * 植物工厂方法类 * @author abing * */ class PlantFactory extends AbstractFactory { /** * 根具传入参数创建相应的植物子类 * @param type * @return * @throws Exception */ public Plant createPlant(String type) throws Exception { Plant plant = (Plant) Class.forName(type).newInstance();//创建动物子类,用反射的方式避免此处代码的修改 return plant; } @Override Animal createAnimal(String type) throws Exception { // TODO Auto-generated method stub return null; } } abstract class AbstractFactory { /** * 生成相应的实体工厂 * @param factorytype * @return * @throws Exception */ public static AbstractFactory getConcreteFactory(String factorytype) throws Exception { AbstractFactory factory=(AbstractFactory)Class.forName(factorytype).newInstance(); return factory; } /** * 根具传入参数创建相应的动物子类 * @param type * @return * @throws Exception */ abstract Animal createAnimal(String type)throws Exception; /** * 根具传入参数创建相应的植物子类 * @param type * @return * @throws Exception */ abstract Plant createPlant(String type)throws Exception; } /** * 测试类 * @author abing * */ public class AbstractFactoryTest{ static Properties properties = new Properties(); /** * 这部分可以写在配置文件里面,每当新扩展一个子类,只用修改配置文件即可 */ static { //------------加入植物动物相关子类到配置中----------- properties.setProperty("t", "com.Tiger"); properties.setProperty("w", "com.Walf"); //------------加入植物相关子类到配置中----------- properties.setProperty("s", "com.SunFlower"); properties.setProperty("p", "com.Pumpkin"); } public static void main(String[] args) throws Exception { String factorytype = "com.PlantFactory";//具体工厂代号,这个也应该放在配置中 String concretetype="s";//具体子类代号 AbstractFactory factory=AbstractFactory.getConcreteFactory(factorytype);//获得具体工厂-PlantFactory Plant plant= factory.createPlant(properties.getProperty(concretetype));//通过工厂生产实际产品-Sum plant.grow(); plant.flower(); } }
JDK中体现:Collection.iterator方法
但是上面这种情况下,植物系列与动物系列的行为不是一样的,到底适合用抽象工厂模式吗?
----------------------------------------------------------
而下面一种方式,应该是最适合于使用抽象工厂模式的。
解决跨数据库的功能,用到抽象工厂模式.用于创建多系列化的对象(如Orale系列,MySql系列)
1.首先定义相关接口(与平常的做法没什么区别) Java代码 // 角色表DAO接口 interface IroleDao { void insert(); void update(); } // 用户表DAO接口 interface IuserDao { void find(); void delete(); } // 角色表DAO接口 interface IroleDao { void insert(); void update(); } // 用户表DAO接口 interface IuserDao { void find(); void delete(); } 2.不同的数据库有不同的SQL语句所以实现时必须分数据库来实现 Java代码 // 用户表Oralce数据库DAO class OracleuserDao implements IuserDao { public void delete() { System.out.println("Oralce 删除用户表数据"); } public void find() { System.out.println("Oralce 查询用户表数据"); } } // 用户表MySql数据库DAO class MySqluserDao implements IuserDao { public void delete() { System.out.println("MySql 删除用户数据"); } public void find() { System.out.println("MySql 查询用户数据"); } } // 角色表Oracle数据库DAO class OracleroleDao implements IroleDao { public void insert() { System.out.println("Oralce 对角色表插入数据"); } public void update() { System.out.println("Oracle 对角色表更新数据"); } } // 角色表MySql数据库DAO class MySqlroleDAO implements IroleDao { public void insert() { System.out.println("MySql 对角色表插入数据"); } public void update() { System.out.println("Mysql 对角色表更新数据"); } } // 用户表Oralce数据库DAO class OracleuserDao implements IuserDao { public void delete() { System.out.println("Oralce 删除用户表数据"); } public void find() { System.out.println("Oralce 查询用户表数据"); } } // 用户表MySql数据库DAO class MySqluserDao implements IuserDao { public void delete() { System.out.println("MySql 删除用户数据"); } public void find() { System.out.println("MySql 查询用户数据"); } } // 角色表Oracle数据库DAO class OracleroleDao implements IroleDao { public void insert() { System.out.println("Oralce 对角色表插入数据"); } public void update() { System.out.println("Oracle 对角色表更新数据"); } } // 角色表MySql数据库DAO class MySqlroleDAO implements IroleDao { public void insert() { System.out.println("MySql 对角色表插入数据"); } public void update() { System.out.println("Mysql 对角色表更新数据"); } } 这里增加了一套DAO的实现 (与平时有所不同,如果有10个数据库就要加上10种不同的实现,比较麻烦呀) 3.定义DAO工厂接口与实现(利用java反射机制生产出你需要的DAO如:userDAO,roleDao) Java代码 // DAO工厂 abstract class DaoFactory { public static DaoFactory getInstance(String classname) { DaoFactory dao = null; try { dao = (DaoFactory) Class.forName(classname).newInstance(); } catch (Exception e) { e.printStackTrace(); } return dao; } abstract IuserDao getuserdao(); abstract IroleDao getroledao(); } // Oralce工厂 class OracleFactory extends DaoFactory { public IroleDao getroledao() { return new OracleroleDao(); } public IuserDao getuserdao() { return new OracleuserDao(); } } // MySql工厂 class MysqlFactory extends DaoFactory { public IroleDao getroledao() { return new MySqlroleDAO(); } public IuserDao getuserdao() { return new MySqluserDao(); } } // DAO工厂 abstract class DaoFactory { public static DaoFactory getInstance(String classname) { DaoFactory dao = null; try { dao = (DaoFactory) Class.forName(classname).newInstance(); } catch (Exception e) { e.printStackTrace(); } return dao; } abstract IuserDao getuserdao(); abstract IroleDao getroledao(); } // Oralce工厂 class OracleFactory extends DaoFactory { public IroleDao getroledao() { return new OracleroleDao(); } public IuserDao getuserdao() { return new OracleuserDao(); } } // MySql工厂 class MysqlFactory extends DaoFactory { public IroleDao getroledao() { return new MySqlroleDAO(); } public IuserDao getuserdao() { return new MySqluserDao(); } } 4. 定义配置文件 Java代码 class Config { // Oralce static final String ORALCE = "org.abc.OracleFactory"; static final String MYSQL = "org.abc.MysqlFactory"; } class Config { // Oralce static final String ORALCE = "org.abc.OracleFactory"; static final String MYSQL = "org.abc.MysqlFactory"; } 配置文件可以定义到XML中去(好处:修改配置项之后不需要对JAVA文件进行编译.) 5.测试你的输出的DAO Java代码 public class Dao { public static void main(String[] args) { DaoFactory.getInstance(Config.ORALCE).getroledao().insert(); DaoFactory.getInstance(Config.MYSQL).getroledao().insert(); } } public class Dao { public static void main(String[] args) { DaoFactory.getInstance(Config.ORALCE).getroledao().insert(); DaoFactory.getInstance(Config.MYSQL).getroledao().insert(); } } 总结 使用条件:一系列接口有一系列的实现 如上IuserDao、IroleDao等一系列的接口,他们可以有一系列的实现(Oracle方式、MySql方式) OracleuserDao、OracleroleDao、MySqluserDao、MySqlroleDAO 组成元素(以上面例子) 一系列接口:IuserDao、IroleDao 一系列实现:Oracle系列、MySql系列 系列工厂类:Oracle系列工厂类、MySql系列工厂类(必须继承抽象工厂类) 抽象工厂类:DaoFactory
JDK中体现:
(1)java.sql包
(2)UIManager(swing外观)
发表评论
-
降低代码复杂度的一些点
2014-05-23 17:59 2378合理使用以下方案,可降低系统的代码复杂度,遵循程序设计的开闭原 ... -
23设计模式-享元模式
2012-11-13 18:55 0作用:共享对象,节省内存 package com; ... -
22设计模式-访问者模式
2012-10-31 17:06 022设计模式-访问者模式 22设计模式-访问者模式 -
21设计模式-中介者模式
2012-10-31 09:42 865中介者模式 中介模式封装一系列的对象交互,集中管理相关对象之间 ... -
20设计模式-迭代器模式
2012-10-28 11:21 0迭代器模式: 提供一种方法顺序一个聚合对象中各个元素,而又不暴 ... -
19设计模式-解释器模式
2012-10-28 11:19 0解释器模式 某一特定领域的问题比较复杂,类似的模式不断重复出现 ... -
18设计模式-桥接模式
2012-10-28 11:19 0桥接模式 将抽象部分与实现部分分离,使它们都可以独立的变化。 ... -
17设计模式-状态模式
2012-10-25 19:05 0状态模式 当一个对象的内在状态改变时允许改变其行为,这个对 ... -
16设计模式-备忘录模式
2012-10-24 10:41 0备忘录模式: 在不破坏封闭的前提下,捕获一个对象的内部状态,并 ... -
15设计模式-命令模式
2012-10-24 10:41 0命令模式 将“请求”封装成对象,以便使用不同的请求、队 ... -
14设计模式-责任链模式
2012-10-31 09:46 782责任链模式: 责任链模式是一种对象的行为模式。在责任链模式里, ... -
13设计模式-组合模式
2012-10-21 14:02 0组合模式详细: 对象间常常通过树结构来组织(包含)起来,以实现 ... -
11.设计模式-外观模式
2012-10-21 13:43 0动机(Motivate): 在软件开发系统中,客户程序 ... -
12设计模式-装饰模式
2012-10-21 10:53 0可以动态的给对象添加 ... -
5设计模式-原型模式
2012-10-19 09:06 0定义:用原型实例指定 ... -
设计模式-自己的理解
2012-10-19 08:52 0参考文章: http://www.cnblogs.com/he ... -
3、4设计模式-生成器模式&单例模式
2012-10-18 20:41 03.生成器模式: 适用: 分步骤创建一个复杂的对象。 构建一 ... -
7.java模板模式与8.策略模式示例
2011-11-17 19:38 2904模板方法简介: 把一些 ... -
9.Java静动态代理模式示例
2011-11-16 10:59 9451.静态代理模式 使用场合: 为其他对象提供一种代理以控制对这 ... -
6.观察者模式详解:关门打狗
2011-11-15 12:17 1506观察者模式原理 观察者模式是对象行动模式,又叫做宣 ...
相关推荐
### C# 中抽象工厂模式详解 #### 模式概述与应用场景 抽象工厂模式是一种常用的创建型设计模式,它提供了一种方法来创建一系列相关的或相互依赖的对象,而无需指定它们的具体类。这种模式的主要目标是封装创建过程...
C# 抽象工厂 Dao 详解 C# 抽象工厂 Dao 详解是关于 C# 语言中抽象工厂设计模式的应用,主要用于构建数据访问层(DAL)和业务逻辑层(BLL)的设计。下面将详细解释抽象工厂 Dao 的设计步骤和难点分析。 Step 1: ...
java设计模式 抽象工厂模式详解 一张图让你彻底明白抽象工厂模式
其中,**抽象工厂模式**、生成器模式、工厂方法模式、原型模式和单件模式是最常见的几种。 ##### 抽象工厂模式(Abstract Factory) 抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们的...
首先,我们需要定义一个抽象工厂接口,例如`AbstractFactory`,它声明了一系列用于创建产品的方法,如`createProductA()`和`createProductB()`。这两个方法分别用于创建两个不同类型的产品A和B。接着,我们可以创建...
### C#工厂模式详解——简单工厂与抽象工厂实例解析 #### 一、工厂模式概述 工厂模式是一种常用的设计模式,在面向对象编程中被广泛应用于创建对象。它通过提供一个统一的接口来创建一系列相关的或相互依赖的对象...
### C++工厂模式详解:简单工厂、工厂方法与抽象工厂 #### 一、引言 在软件工程领域,设计模式是一种被广泛接受的解决常见问题的解决方案。其中,工厂模式是一种常用的创建型模式,用于封装对象的创建过程,提供一...
### Java中抽象类和接口的区别与作用详解 #### 一、引言 在Java编程语言中,`abstract class`和`interface`是两种用于定义抽象类的重要机制。这两种机制不仅支持了Java的强大面向对象特性,而且也在实际开发过程中...
### .NET 抽象工厂与存储过程添加数据详解 #### 一、背景介绍 在.NET框架下进行数据库操作时,为了提高代码的可维护性和扩展性,常常会采用设计模式来组织代码结构。其中,抽象工厂模式是一种常用的设计模式,它...
2. **允许抽象成员**:抽象类可以包含抽象方法、抽象属性、抽象索引器和抽象事件。这些都是只有签名而无实现的方法,必须由子类重写。 3. **不能被密封**:`sealed`关键字用于防止类被继承,但抽象类不能被密封,...
1. **抽象工厂(Abstract Factory)**:这是一个接口或抽象类,定义了用于创建产品的工厂方法。这个方法通常返回一个产品对象。 2. **具体工厂(Concrete Factories)**:这些是继承自抽象工厂的具体类。每个具体...
【抽象工厂模式详解】 抽象工厂模式是设计模式中的一种创建型模式,它的主要目标是提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。这种模式允许系统在不修改现有代码的情况下,扩展产品族,...
**抽象工厂模式详解** 抽象工厂模式是设计模式中的一种,主要目的是为了提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。这种模式遵循“开闭原则”,即对扩展开放,对修改关闭,允许在不修改...
很好的模式 简单易懂 工厂模式属于创建型模式,大致可以分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。听上去差不多,都是工厂模式。下面一个个介绍,首先介绍简单工厂模式,它的主要特点是需要在工厂类中做...
【C# MySchool 抽象工厂与三层架构模式详解】 在C#编程中,`抽象工厂`模式是一种设计模式,它提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在`MySchool`项目中,抽象工厂可能被用来创建...
Java设计模式之抽象工厂模式实例详解 Java设计模式之抽象工厂模式实例详解是指在软件设计中,通过提供一个创建一系列相关或相互依赖对象的接口,且无需指定它们具体的类别的方式来生成这些对象的模式。抽象工厂模式...
本文将详细介绍iOS中的三种工厂模式:简单工厂模式、工厂方法模式以及抽象工厂模式,并结合具体示例、图解和分析进行阐述。 **1. 简单工厂模式** 简单工厂模式,也称为静态工厂模式,它通过一个公共的静态方法来...
2. **抽象工厂模式** 更进一步,允许创建一族相关的对象,而不必指定它们的具体类。如下所示: ```java interface IProduct1 { public void show(); } interface IProduct2 { public void show(); } class ...
1. **工厂方法模式的核心思想**:定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类。 2. **角色**: - **抽象工厂(Abstract Factory)**:定义一个创建对象的接口,通常是一个...