zoukankan      html  css  js  c++  java
  • 设计模式之工厂模式和抽象工厂模式

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

      本质:实例化对象,用工厂方法代替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();
        }
    }

      

  • 相关阅读:
    android 学习
    android 学习
    阅读笔记《人月神话》1
    android 学习
    android 学习
    android 学习
    android 学习
    android 学习(家庭记账本的开发 6)
    每日日报
    每日日报
  • 原文地址:https://www.cnblogs.com/parryyang/p/5804273.html
Copyright © 2011-2022 走看看