设计模式之工厂模式和抽象工厂模式

工厂模式(实现创建者和调用者的分离,实现解耦)

  本质:实例化对象,用工厂方法代替new()操作;

     将选择实现类、创建对象统一管理和控制;从而实现将调用者和实现类解耦;

  分类:

     简单工厂:用来生产统一等级结构中的任何产品(对于增加新的产品,需要修改已有的代码)

     工厂方法:用来生产同一等级中的固定产品(对于增加新的产品,不需要修改已有的代码)

     抽象工厂模式:用来生产不同产品族的全部产品(对于增加新的产品无能为力,但是支持增加产品族)

 

  记得之前参与过的一个产品,根据不同的公司的需求,我们需要通过修改配置文件,从而连接到不同的数据库,支持DB2,mysql,Orical,那个实现就是用简单工厂来实现。现在简单来模拟一下:

 简单工厂:

  简单工厂的缺点在于:如果我需要添加支持DB2的数据库,需要修改原有的代码!

/**
 * <p>
 * Database 实体接口
 * <p>*/
public interface Database {
    void getDatabase();
}
/**
 * <p>
 * MysqlDB Mysql数据库连接实体
 * <p>*/
public class MysqlDB implements Database{
    @Override
    public void getDatabase() {
        System.out.println("连接到mysql数据库");
    }
}
/**
 * <p>
 * OricalDB Orical数据库连接实体
 * <p>
 */
public class OricalDB implements Database {
    @Override
    public void getDatabase() {
        System.out.println("连接到orical数据库");
    }
}
/**
 * <p>
 * DBFactory 数据库连接工厂类
 * <p>*/
public class DBFactory {
    /**
     * 创建mysql连接实体
     * @return
     */
    public static Database connectionMysql(){
        return new MysqlDB();
    }
    /**
     * 创建orical连接实体
     * @return
     */
    public static Database connectionOrical(){
        return new OricalDB();
    } 
}
/**
 * <p>
 * Client 测试类
 * <p>
 */
public class Client {
    public static void main(String[] args) {
        Database orical = DBFactory.connectionOrical();
        Database mysql = DBFactory.connectionMysql();
        orical.getDatabase();
        mysql.getDatabase();
    }
}

 工厂方法 

   工厂方法模式和简单工厂模式最大的区别在于,简单工厂只有一个工厂类,但是工厂方法模式有一组实现了相同接口的工厂类,从而保证添加新产品,只需要通过增加新类即可,不需要修改原有代码!现在我们用工厂方法模式实现上面的需求:

  首先添加如上三个类:Database、MysqlDB、OricalDB。再添加如下类:

/**
 * <p>
 * DBFactory 工厂类接口
 * <p>
 */
public interface DBFactory {
    Database connectionDB();
}
/**
 * <p>
 * MysqlDBFactory mysql工厂类接口类现类
 * <p>
 */
public class MysqlDBFactory implements DBFactory {
    @Override
    public Database connectionDB() {
        return new MysqlDB();
    }
}
/**
 * <p>
 * OricalDBFactory Orical工厂类接口类现类
 * <p>
 */
public class OricalDBFactory implements DBFactory{
    @Override
    public Database connectionDB() {
        return new OricalDB();
    }
}
/**
 * <p>
 * Client 工厂方法 实现工厂模式测试类
 * <p>*/
public class Client {
    public static void main(String[] args) {
        Database orical = new OricalDBFactory().connectionDB();
        Database mysql = new MysqlDBFactory().connectionDB();

        orical.getDatabase();
        mysql.getDatabase();
    }
}

 抽象工厂模式

  抽象工厂模式是工厂方法的升级版本,在多个业务品种、业务分类(即不同产品族)时,通过抽象工厂模式生产需要的对象是一种非常好的解决办法。

  所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。比如:汽车有高档、低档之分,具体来说是高档车配备了高端的引擎、高端轮胎...,而低档车配备了低端的引擎、低端的轮胎;那么轮胎、引擎就是两个产品族。

  工厂类生产出高档车就应该配备高端引擎和轮胎;低档车就应该配备低端的引擎和轮胎。下面我们来试试这个例子:

  

/**
 * Engine 引擎接口*/
public interface Engine {
    void run();
}
/**
 * 高端引擎
 */
class HighEngine implements Engine{
    @Override
    public void run() {
        System.out.println("高端发动机,跑的就是快...");
    }
}
/**
 * 低端引擎
 */
class LowEngine implements Engine{
    @Override
    public void run() {
        System.out.println("低端发动机,跑的好慢...");
    }
}
/**
 * 轮胎类接口 
 */
public interface Tyre {
    void skidproof();
}
/**
 * 高端轮胎
 */
class HighTyre implements Tyre{
    @Override
    public void skidproof() {
        System.out.println("高端轮胎就是防滑的...");
    }
}
/**
 * 低端轮胎
 */
class LowTyre implements Tyre{
    @Override
    public void skidproof() {
        System.out.println("低端轮胎是不防滑的...");
    }
}
/**
 * 汽车工厂接口
 */
public interface CarFactory {
    //创建引擎
    Engine creatEnginer();
    //创建轮胎
    Tyre createTyre();
}
/**
 * 高端汽车工厂
 */
class HighCarFactory implements CarFactory{
    @Override
    public Engine creatEnginer() {
        return new HighEngine();
    }
    @Override
    public Tyre createTyre() {
        return new HighTyre();
    }
}
/**
 * 低端汽车工厂
 */
class LowCarFactory implements CarFactory{
    @Override
    public Engine creatEnginer() {
        return new LowEngine();
    }
    @Override
    public Tyre createTyre() {
        return new LowTyre();
    }  
}
/**
 * 抽象工厂测试类
 */
public class Client {

    public static void main(String[] args) {
        CarFactory highCarFactory = new HighCarFactory();
        Engine engine = highCarFactory.creatEnginer();
        Tyre tyre = highCarFactory.createTyre();
        engine.run();
        tyre.skidproof();
    }
}

 

  

posted @ 2016-08-30 10:40  星星满天  阅读(266)  评论(0编辑  收藏  举报