首页编程java编程为什么要使用抽象工厂模式 java,java中抽象工厂模式和原型模式之间的区别

为什么要使用抽象工厂模式 java,java中抽象工厂模式和原型模式之间的区别

编程之家2023-10-12107次浏览

大家好,为什么要使用抽象工厂模式 java相信很多的网友都不是很明白,包括java中抽象工厂模式和原型模式之间的区别也是一样,不过没有关系,接下来就来为大家分享关于为什么要使用抽象工厂模式 java和java中抽象工厂模式和原型模式之间的区别的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

为什么要使用抽象工厂模式 java,java中抽象工厂模式和原型模式之间的区别

java中抽象工厂模式和原型模式之间的区别

工厂模式的好处就在于将工厂和产品之间的耦合降低,将具体产品的构造过程放在了具体工厂类里面。在以后扩展产品的时候方便很多,只需要添加一个工厂类,一个产品类,就能方便的添加产品,而不需要修改原有的代码。而在简单工厂中,如果要增加一个产品,则需要修改工厂类,增加if/else分支,或者增加一个case分支,工厂模式符合软件开发中的OCP原则(open close principle),对扩展开放,对修改关闭。

抽象工厂模式:这个模式我总是感觉和builder模式非常相似。

工厂方法模式提供的是对一个产品的等级模式,,而抽象工厂方法提供的是对多个产品的等级模式,注意,这里的多个具体产品之间是相互耦合的,也就是说这里的抽象工厂提供的产品之间是存在某种联系的。

为什么要使用抽象工厂模式 java,java中抽象工厂模式和原型模式之间的区别

有人做如下的比较:

工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。

一个抽象工厂类,可以派生出多个具体工厂类。

为什么要使用抽象工厂模式 java,java中抽象工厂模式和原型模式之间的区别

每个具体工厂类只能创建一个具体产品类的实例。

抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。

一个抽象工厂类,可以派生出多个具体工厂类。

每个具体工厂类可以创建多个具体产品类的实例。

区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。

工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

Java 抽象工厂模式

题目中的Collocation就相当于一个抽象工厂,在下面的Windows,Unix,Linux三个类中实现这个接口,这三个类就相当于具体工厂,在这三个类中实现接口中的三个方法。

然后在客户端使用的时候只需要实例化一个具体工厂,就可以得到具体的产品,如下所示:

Collocation collocation= new Windows()或者 new Unix()或者 new Linux()

最后用collocation调用那三个方法,便可以得到具体的产品了。

java 抽象工厂模式

工厂模式在项目中是常常用到的,有人说只有大项目才会用到,小项目是体会不出来.其实使用设计模式与项目的大小没有实质性的联系.设计模式是经验的总结而不是衡量项目大小的标准.

以开发项目的DAO层为例,在项目中客户的需求是常常变动的,临时更换数据库的需求也是常常发生的,那我们要如何解决跨数据库的功能,这里就要使用到抽象工厂模式了.工厂模式常常用于创建多系列化的对象(如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

为什么要使用抽象工厂模式 java和java中抽象工厂模式和原型模式之间的区别的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!

java接口中属性有什么用(java中什么是接口接口的作用是什么)java中的二维数组是什么 java 二维数组怎么定义