zoukankan      html  css  js  c++  java
  • 抽象工厂模式(设计模式_17)

    抽象工厂模式:的简单理解是,用来生成不同的产品族(就像一个家族一样),例如:总工厂,分工厂,每个工厂都可以制造,其他很多不同的产品;

    以下举例两个案例,来体现抽象工厂模式:


    案例一:(造汽车)
    制造各种名牌汽车,有总工厂,分工厂来制造,各种不同品牌的汽车;

    package com.oop.demo4.car1;
    
    /**
     * 抽象出奔驰车制作标准规范接口
     * @author Liudeli
     *
     */
    public interface BenzCar {
    
        /**
         * 制造轮胎
         */
        public void doTyre();
    
        /**
         * 制造发动机
         */
        public void doEngine();
    
        /**
         * 制造底盘
         */
        public void doChassis();
    
    }
    
    package com.oop.demo4.car1;
    
    /**
     * 分公司制造中心
     * @author Liudeli
     *
     */
    public class FBenzCar implements BenzCar{
    
        public void doTyre() {
            System.out.println("分公司把奔驰的轮胎已经生产好了...");
        }
    
        public void doEngine() {
            System.out.println("分公司把奔驰的发动机已经研制成功了...");
        }
    
        public void doChassis() {
            System.out.println("分公司把奔驰的底盘已经制作好了...");
        }
    
    }
    
    package com.oop.demo4.car1;
    
    /**
     * 总公司制造中心
     * @author Liudeli
     *
     */
    public class ZBenzCar implements BenzCar{
    
        public void doTyre() {
            System.out.println("总公司把奔驰的轮胎已经生产好了...");
        }
    
        public void doEngine() {
            System.out.println("总公司把奔驰的发动机已经研制成功了...");
        }
    
        public void doChassis() {
            System.out.println("总公司把奔驰的底盘已经制作好了...");
        }
    
    }
    
    package com.oop.demo4.car2;
    
    /**
     * 抽象出宝马车制作标准接口规范
     * @author Liudeli
     *
     */
    public interface BMWCar {
    
        /**
         * 制造宝马车轮胎
         */
        public void doDoor();
    
    }
    
    package com.oop.demo4.car2;
    
    /**
     * 分公司制造宝马车对象
     * @author Liudeli
     *
     */
    public class FBMWCar implements BMWCar {
    
        public void doDoor() {
            System.out.println("分公司把宝马车的门制造成功了...");
        }
    
    }
    
    package com.oop.demo4.car2;
    
    /**
     * 总公司制造宝马车对象
     * @author Liudeli
     *
     */
    public class ZBMWCar implements BMWCar{
    
        public void doDoor() {
            System.out.println("总公司把宝马车的门制造好了...");
        }
    
    }
    
    package com.oop.demo4.factory;
    
    import com.oop.demo4.car1.BenzCar;
    import com.oop.demo4.car2.BMWCar;
    
    /**
     * 抽象出工厂接口
     * @author Liudeli
     *
     */
    public interface Factory {
    
        /**
         * 创建奔驰车
         * @return
         */
        public BenzCar createBeanz();
    
        /**
         * 创建宝马车
         * @return
         */
        public BMWCar createBMW();
    
    }
    
    package com.oop.demo4.factory;
    
    import com.oop.demo4.car1.BenzCar;
    import com.oop.demo4.car1.FBenzCar;
    import com.oop.demo4.car2.BMWCar;
    import com.oop.demo4.car2.FBMWCar;
    
    /**
     * 分工厂 制造厂
     * @author Liudeli
     *
     */
    public class FFactory implements Factory{
    
        public BenzCar createBeanz() {
            return new FBenzCar();
        }
    
        public BMWCar createBMW() {
            return new FBMWCar();
        }
    
    }
    
    package com.oop.demo4.factory;
    
    import com.oop.demo4.car1.BenzCar;
    import com.oop.demo4.car1.ZBenzCar;
    import com.oop.demo4.car2.BMWCar;
    import com.oop.demo4.car2.ZBMWCar;
    
    /**
     * 总工厂 制作厂
     * @author Liudeli
     *
     */
    public class ZFactory implements Factory{
    
        public BenzCar createBeanz() {
            return new ZBenzCar();
        }
    
        public BMWCar createBMW() {
            return new ZBMWCar();
        }
    
    }
    
    package com.oop.demo4.main;
    
    import com.oop.demo4.car1.BenzCar;
    import com.oop.demo4.car2.BMWCar;
    import com.oop.demo4.factory.FFactory;
    import com.oop.demo4.factory.Factory;
    import com.oop.demo4.factory.ZFactory;
    
    /**
     * 测试程序
     * @author Liudeli
     *
     */
    public class Test {
    
        public static void main(String[] args) {
            // 总公司 生产制造厂
            Factory factory = new ZFactory();
            // 修改成分公司制作厂去制造
            // factory = new FFactory();
    
            // 制作奔驰车零件
            BenzCar beanz = factory.createBeanz();
            beanz.doChassis();
            beanz.doEngine();
            beanz.doTyre();
    
            // 制作宝马车零件
            BMWCar bmw = factory.createBMW();
            bmw.doDoor();
        }
    
    }
    

    运行结果:
    这里写图片描述

    修改工厂:

    Factory factory = new FFactory();

    运行结果:
    这里写图片描述



    案例二:(数据库DB,切换)
    软件工程师在维护一个项目,这个项目最初是用Oracle数据库来做的,现在要更换成Sqlserver数据库,有可能以后还会切换到Oracle数据库,所以他想到了一招,就是用抽象工厂模式来切换数据库即可:

    package com.oop.demo3;
    
    /**
     * 模拟用户对象数据
     * @author Liudeli
     *
     */
    public class User {
    
        // 模拟ID 和 NAME 其他很多值 省略...
    
        private int id;
        private String name;
    
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    
        public String toString() {
            return "User [id=" + id + ", name=" + name + "]";
        }
    
    }
    
    package com.oop.demo3;
    
    /**
     * 定义数据模版接口标准
     * @author Liudeli
     *
     */
    public interface IUser {
    
        /**
         * 模拟插入一条用户数据
         * @param user
         */
        public void insert(User user);
    
        /**
         * 模拟删除一条数据
         * @param id
         */
        public void detele(int id);
    }
    
    package com.oop.demo3;
    
    /**
     * 模拟使用SQLServer数据库操作User数据
     * @author Liudeli
     *
     */
    public class SQLServerUser implements IUser{
    
        public void insert(User user) {
            System.out.println("用户数据 id:1, name:liudeli");
        }
    
        public void detele(int id) {
            System.out.println("用户数据 id:" + id + "已被删除成功...");
        }
    
    }
    
    package com.oop.demo3;
    
    /**
     * 模拟使用Oracle数据库操作User数据
     * @author Liudeli
     *
     */
    public class OracleUser implements IUser {
    
        public void insert(User user) {
            System.out.println("用户数据 id:2, name:lnderly");
        }
    
        public void detele(int id) {
            System.out.println("用户数据 id:" + id + "已被删除成功...");
        }
    
    }
    
    package com.oop.demo3;
    
    /**
     * 模拟人的对象数据
     * @author Liudeli
     *
     */
    public class Person {
    
        // 模拟name 和 sex 其他很多值 省略...
    
        private String name;
        private String sex;
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getSex() {
            return sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public String toString() {
            return "Person [name=" + name + ", sex=" + sex + "]";
        }
    }
    
    package com.oop.demo3;
    
    public interface IPerson {
    
        public void update(Person person);
    
    }
    
    package com.oop.demo3;
    
    public class SQLServerPerson implements IPerson{
    
        public void update(Person person) {
            System.out.println("Person 更新了一条数据信息...");
        }
    
    }
    
    package com.oop.demo3;
    
    public class OraclePerson implements IPerson{
    
        public void update(Person person) {
            System.out.println("Person 更新了一条数据...");
        }
    
    }
    
    package com.oop.demo3;
    
    /**
     * 定义规范标准工厂,实例化那个对象
     * @author Liudeli
     *
     */
    public interface IFactory {
    
        /**
         * 创建使用哪种数据库模式来操作
         * @return
         */
        public IUser createUserFactory();
    
        public IPerson createPersonFactory();
    
    }
    
    package com.oop.demo3;
    
    public class OracleFactory implements IFactory{
    
        public IUser createUserFactory() {
            return new OracleUser();
        }
    
        public IPerson createPersonFactory() {
            return new OraclePerson();
        }
    
    }
    
    package com.oop.demo3;
    
    public class SQLServerFactory implements IFactory{
    
        public IUser createUserFactory() {
            return new SQLServerUser();
        }
    
        public IPerson createPersonFactory() {
            return new SQLServerPerson();
        }
    
    }
    
    package com.oop.demo3;
    
    /*
     * 
     */
    
    /**
     * 测试程序
     * @author Liudeli
     *
     */
    public class Main {
    
        public static void main(String[] args) {
    
            // 获取到数据
            User user = new User();
            Person person = new Person();
    
            // 得到工厂
            IFactory factory = new OracleFactory();
            // factory = new SQLServerFactory(); // 切换SQLServer数据库
    
            IUser createUserFactory = factory.createUserFactory();
            createUserFactory.insert(user);
            createUserFactory.detele(9);
    
            IPerson createPersonFactory = factory.createPersonFactory();
            createPersonFactory.update(person);
    
        }
    
    }
    

    运行结果:
    这里写图片描述


    谢谢大家的观看,更多精彩技术博客,会不断的更新,请大家访问,
    刘德利CSDN博客, http://blog.csdn.net/u011967006

  • 相关阅读:
    梯度下降
    最小二乘法模型的推导原理
    斗图啦+多线程(队列)
    scrapy错误-[scrapy.core.scraper] ERROR: Spider error processing
    python使用requests时报错requests.exceptions.SSLError: HTTPSConnectionPool
    AttributeError: module 'requests' has no attribute 'get'的错误疑惑
    *arg,**kwargs的参数作用的疑惑
    scrapy框架--新建调试的main.py文件
    Scrapy框架——安装以及新建scrapy文件
    爬虫-ajax请求遇到Unicode编码问题
  • 原文地址:https://www.cnblogs.com/android-deli/p/10322199.html
Copyright © 2011-2022 走看看