工厂设计模式与普通的继承跟本区别在于工厂设计模式中的功能方法会用到没有实现的抽象方法所返回的结果,在工厂方法模式里面,客户端要么使用Creator对象,要么使用Creator创建的对象,一般客户端不直接使用工厂方法
工厂方法模式和IoC/DI的思想是相似的,都是“主动变被动”,进行了“主从换位”,从而获得了更灵活的程序结构。只是在被动获取资源的方式上不同,IoC/DI是通过set的方式注入,而工厂方法模式则延迟到子类实现时区提供资源。
1:简单工厂(Simple Factory)。
又叫静态工厂,主要有一个静态方法,用来接受参数,并根据参数来决定返回
实现同一接口的不同类的实例。比较难扩展,如果要添加一个新的产品必须要修改静态工厂类,添加新的判断逻辑
2:工厂方法(Factory Method)。
工厂方法为工厂类定义了接口,用多态来削弱了工厂类的职能
public interface Factory{
public Product create();
}
public class AFactory implements Factory{
public Product create(){
return Aproduct;
}
}
public class BFactory implements Factory{
public Product create(){
return Bproduct ;
}
}
简单工厂是把创建产品的职能都放在一个类里面,而工厂方法则把不同的产品放在实现了工厂接口的不同工厂类里面,以后增加新产品,只需要新增一个实现工厂接口工厂类,就能达到,不用修改已有的代码
3:抽象工厂(Abstract Factory)。
意图在于创建一系列互相关联或互相依赖的对象
一系列接口,且每个接口有一系列的实现,这样每个工厂生产一系列的产品,比如有A B C 三个接口(冰箱,洗衣机,空调),然后每个接口有一系列实现,比如A有A1,A2,A3,一个工厂可以生产A1,B1,C1这样一套产品(海尔冰箱,海尔洗衣机,海尔空调).
http://zhidao.baidu.com/question/63058512.html
// 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();
}
}
工厂方法模式和抽象工厂模式区别如下
工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。