`

1.工厂方法与2.抽象工厂详解

阅读更多
下面是一个典型的工厂方法模式:
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外观)
分享到:
评论

相关推荐

    c#详解抽象工厂

    ### C# 中抽象工厂模式详解 #### 模式概述与应用场景 抽象工厂模式是一种常用的创建型设计模式,它提供了一种方法来创建一系列相关的或相互依赖的对象,而无需指定它们的具体类。这种模式的主要目标是封装创建过程...

    C# 抽象工厂 Dao 详解

    C# 抽象工厂 Dao 详解 C# 抽象工厂 Dao 详解是关于 C# 语言中抽象工厂设计模式的应用,主要用于构建数据访问层(DAL)和业务逻辑层(BLL)的设计。下面将详细解释抽象工厂 Dao 的设计步骤和难点分析。 Step 1: ...

    抽象工厂模式uml类图

    java设计模式 抽象工厂模式详解 一张图让你彻底明白抽象工厂模式

    概括设计模式,举例详解抽象工厂模式

    其中,**抽象工厂模式**、生成器模式、工厂方法模式、原型模式和单件模式是最常见的几种。 ##### 抽象工厂模式(Abstract Factory) 抽象工厂模式提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们的...

    PHP实现设计模式中的抽象工厂模式详解共7页.pdf.zi

    首先,我们需要定义一个抽象工厂接口,例如`AbstractFactory`,它声明了一系列用于创建产品的方法,如`createProductA()`和`createProductB()`。这两个方法分别用于创建两个不同类型的产品A和B。接着,我们可以创建...

    c#工厂模式——简单工厂_抽象工厂实例

    ### C#工厂模式详解——简单工厂与抽象工厂实例解析 #### 一、工厂模式概述 工厂模式是一种常用的设计模式,在面向对象编程中被广泛应用于创建对象。它通过提供一个统一的接口来创建一系列相关的或相互依赖的对象...

    C++ 工厂模式 (简单工厂、工厂和抽象工厂)

    ### C++工厂模式详解:简单工厂、工厂方法与抽象工厂 #### 一、引言 在软件工程领域,设计模式是一种被广泛接受的解决常见问题的解决方案。其中,工厂模式是一种常用的创建型模式,用于封装对象的创建过程,提供一...

    Java中抽象类和接口的区别与作用详解

    ### Java中抽象类和接口的区别与作用详解 #### 一、引言 在Java编程语言中,`abstract class`和`interface`是两种用于定义抽象类的重要机制。这两种机制不仅支持了Java的强大面向对象特性,而且也在实际开发过程中...

    .net抽象工厂+存储过程添加数据

    ### .NET 抽象工厂与存储过程添加数据详解 #### 一、背景介绍 在.NET框架下进行数据库操作时,为了提高代码的可维护性和扩展性,常常会采用设计模式来组织代码结构。其中,抽象工厂模式是一种常用的设计模式,它...

    C#抽象类详解文档.doc

    2. **允许抽象成员**:抽象类可以包含抽象方法、抽象属性、抽象索引器和抽象事件。这些都是只有签名而无实现的方法,必须由子类重写。 3. **不能被密封**:`sealed`关键字用于防止类被继承,但抽象类不能被密封,...

    PHP 工厂方法模式.pdf

    1. **抽象工厂(Abstract Factory)**:这是一个接口或抽象类,定义了用于创建产品的工厂方法。这个方法通常返回一个产品对象。 2. **具体工厂(Concrete Factories)**:这些是继承自抽象工厂的具体类。每个具体...

    java设计模式之抽像工厂详解

    【抽象工厂模式详解】 抽象工厂模式是设计模式中的一种创建型模式,它的主要目标是提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。这种模式允许系统在不修改现有代码的情况下,扩展产品族,...

    PHP实现设计模式中的抽象工厂模式详解

    **抽象工厂模式详解** 抽象工厂模式是设计模式中的一种,主要目的是为了提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。这种模式遵循“开闭原则”,即对扩展开放,对修改关闭,允许在不修改...

    工厂模式详解

    很好的模式 简单易懂 工厂模式属于创建型模式,大致可以分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。听上去差不多,都是工厂模式。下面一个个介绍,首先介绍简单工厂模式,它的主要特点是需要在工厂类中做...

    C# MySchool 抽象工厂,三层架构模式,含开发文档

    【C# MySchool 抽象工厂与三层架构模式详解】 在C#编程中,`抽象工厂`模式是一种设计模式,它提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在`MySchool`项目中,抽象工厂可能被用来创建...

    Java设计模式之抽象工厂模式实例详解

    Java设计模式之抽象工厂模式实例详解 Java设计模式之抽象工厂模式实例详解是指在软件设计中,通过提供一个创建一系列相关或相互依赖对象的接口,且无需指定它们具体的类别的方式来生成这些对象的模式。抽象工厂模式...

    iOS三种工厂模式详解(demo + 图 +分析)

    本文将详细介绍iOS中的三种工厂模式:简单工厂模式、工厂方法模式以及抽象工厂模式,并结合具体示例、图解和分析进行阐述。 **1. 简单工厂模式** 简单工厂模式,也称为静态工厂模式,它通过一个公共的静态方法来...

    java 单例模式和工厂模式实例详解.docx

    2. **抽象工厂模式** 更进一步,允许创建一族相关的对象,而不必指定它们的具体类。如下所示: ```java interface IProduct1 { public void show(); } interface IProduct2 { public void show(); } class ...

    设计模式之工厂方法模式

    1. **工厂方法模式的核心思想**:定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类。 2. **角色**: - **抽象工厂(Abstract Factory)**:定义一个创建对象的接口,通常是一个...

Global site tag (gtag.js) - Google Analytics