大白话抽象工厂模式

先说最难的 抽象工厂模式,
现在有一种情景: 你相对比一下ak47开枪的一瞬间,沙漠之鹰开枪得一瞬间,手弩开枪的一瞬间 哪个更爽

你需要 ak47 ak47的子弹 装弹过程 开枪瞬间
沙漠之鹰 沙漠之鹰子弹 装弹过程 开枪瞬间
手弩 手弩子弹 装弹过程 开枪瞬间

  1. 你去了 ak47工厂拿到了 ak47 子弹,装弹教程,开枪说明书
  2. 你去了 沙漠之鹰工厂拿到了 沙漠之鹰 子弹,装弹教程,开枪说明书
  3. 你去了 手弩 工厂拿到了 手弩 子弹,装弹教程,开枪说明书

好像可以抽象一下 总感觉有点相似的地方

我抽象一下好了 搞个工厂 生产ak47 沙漠之鹰 手弩 和对应的子弹

首先 能想到 用工厂模式 路子是对的,但是怎么抽象 又无从下手,

简单点说
实现代码步骤
1 武器工厂 ak47 沙漠之鹰 手弩
2 子弹工厂 ak47子弹 沙漠之鹰 手弩子弹
3 装弹说明书工厂 ak47装弹说明书 沙漠之鹰装弹说明书 手弩装弹说明书
4 开枪说明书工厂 ak47开枪说明书 沙漠之鹰开枪说明书 手弩开枪说明书
5 我想要 1 2 4 我会装子弹 不要说明书了 我只要 AK47 沙漠之鹰的武器
第一步 武器工厂代码

/**
 * 武器工厂
 * 1 不直接生产武器
 * 2 负责生产各种武器的工厂
 * 3 生产一个工厂,让工厂去造武器
 */
 interface Arms {
    public void getArmsName();
}


/**
 * 专门生产AK47
 */
public class Ak47 implements Arms {
    @Override
    public void getArmsName() {
        System.out.println("我是AK47");
    }
}

/**
 * 专门生产沙漠之鹰
 */

public class DesertEagle implements Arms {
    @Override
    public void getArmsName() {
        System.out.println("我是沙漠之鹰");
    }
}

/**
 * 专门生产手弩
 */
public class Bowgun implements Arms {
    @Override
    public void getArmsName() {
        System.out.println("我是手弩");
    }
}

2 子弹工厂 代码

/**
 * 专门生产子弹制造工厂
 */

public interface Bullet {
    public void getBulletName();
}

/**
 * 专门生产AK47子弹工厂
 */

public class AK47Bullet implements Bullet {
    @Override
    public void getBulletName() {
        System.out.println("生产Ak47子弹");
    }
}


/**
 * 专门生产沙漠之鹰子弹
 */

public class DesertEagleBullet implements Bullet {
    @Override
    public void getBulletName() {
        System.out.println("生产沙漠之鹰子弹");
    }
}


/**
 * 专门生产手弩子弹制造工厂
 */

public class BowgunBullet implements Bullet {
    @Override
    public void getBulletName() {
        System.out.println("生产手弩弓箭");
    }
}


3装弹说明书工厂

/**
 * 生产装弹说明工厂
 */
public interface Chambering {
    public void getChamberingName();
}
/**
 * AK47装弹说明
 */
public class Ak47Chambering implements Chambering {
    @Override
    public void getChamberingName() {
        System.out.println("Ak47装弹说明");
    }
}
/**
 * 沙漠之鹰 装弹说明
 */
public class DesertEagleChambering implements Chambering {
    @Override
    public void getChamberingName() {
        System.out.println("沙漠之鹰装弹说明");
    }
}
/**
 * 手弩 装弹说明
*/
public class BowgunChambering implements Chambering {
    @Override
    public void getChamberingName() {
        System.out.println("手弩装弹说明");
    }
}

4 开枪``说明书工厂

/**
 * 生产开枪 说明书工厂
 */
public interface Shot {
    public void getShotName();
}
/**
 * AK47 开枪教程
*/
public class AK47Shot implements Shot {
    @Override
    public void getShotName() {
        System.out.println("ak47 开枪教程");
    }
}
/**
 * 沙漠之鹰 开枪教程
 */
public class DesertEagleShot implements Shot {
    @Override
    public void getShotName() {
        System.out.println("沙漠之鹰 开枪教程");
    }
}
/**
 * 手弩 开枪教程
 */
public class BowgunShot implements Shot {
    @Override
    public void getShotName() {
        System.out.println("手弩开枪教程");
    }
}

以上 都是很一般的操作 只是把关系搞清楚 抽象工厂精髓 在下边

5 我想要 1 2 4 我会装子弹 不要说明书了 我只要 AK47 沙漠之鹰的武器
特殊业务 特殊处理

分析一下
1 我要武器 开枪说明 子弹 不要装弹说明书 因为我会装弹
2 我要AK47 沙漠之鹰
3 比较那个开枪爽
开始写代码

/**
 * 5.1  抽象类 适用于拼装
 * 根据业务需求 搞定抽象类
 * 当前业务 只要 武器 开枪说明 子弹
 */
abstract class AK47AndDesertEagleFactory {
    abstract ArmsFactory getArms(String armsName );
    abstract BulletFactory getBullet(String bulletName);
    abstract ChamberingFactory getChambering(String chamberingName);
}
/**
 * 5.2 arms 下面有三个工厂 所以 armsFactory就可以得到工厂所有
 * 用五分钟 品味 ArmsFactory与Arms关系 
 * Arms 与 Ak47
 */
public class ArmsFactory extends AK47AndDesertEagleFactory {

    @Override
    Arms getArms(String armsName) {
        if("AK47".equals(armsName)){
            return new Ak47();
        }else if("Bowgun".equals(armsName)){
            return new Bowgun();
        }else if("DesertEagle".equals(armsName)){
            return new DesertEagle();
        }
        return null;
    }

    @Override
    Bullet getBullet(String bulletName) {
        if("AK47Bullet".equals(bulletName)){
            return new AK47Bullet();
        }else if("BowgunBullet".equals(bulletName)){
            return new BowgunBullet();
        }else if("DesertEagleBullet".equals(bulletName)){
            return new DesertEagleBullet();
        }
        return null;
    }

    @Override
    Chambering getChambering(String chamberingName) {
        if("AK47ChamberingName".equals(chamberingName)){
            return new Ak47Chambering();
        }else if("BowgunchamberingName".equals(chamberingName)){
            return new BowgunChambering();
        }else if("DesertEaglechamberingName".equals(chamberingName)){
            return new DesertEagleChambering();
        }
        return null;
    }

内容概要:本文档详细介绍了Android开发中内容提供者(ContentProvider)的使用方法及其在应用间数据共享的作用。首先解释了ContentProvider作为四大组件之一,能够为应用程序提供统一的数据访问接口,支持不同应用间的跨进程数据共享。接着阐述了ContentProvider的核心方法如onCreate、insert、delete、update、query和getType的具体功能与应用场景。文档还深入讲解了Uri的结构和作用,它是ContentProvider中用于定位资源的重要标识。此外,文档说明了如何通过ContentResolver在客户端应用中访问其他应用的数据,并介绍了Android 6.0及以上版本的运行时权限管理机制,包括权限检查、申请及处理用户的选择结果。最后,文档提供了具体的实例,如通过ContentProvider读写联系人信息、监听短信变化、使用FileProvider发送彩信和安装应用等。 适合人群:对Android开发有一定了解,尤其是希望深入理解应用间数据交互机制的开发者。 使用场景及目标:①掌握ContentProvider的基本概念和主要方法的应用;②学会使用Uri进行资源定位;③理解并实现ContentResolver访问其他应用的数据;④熟悉Android 6.0以后版本的权限管理流程;⑤掌握FileProvider在发送彩信和安装应用中的应用。 阅读建议:建议读者在学习过程中结合实际项目练习,特别是在理解和实现ContentProvider、ContentResolver以及权限管理相关代码时,多进行代码调试和测试,确保对每个知识点都有深刻的理解。
开发语言:Java 框架:SSM(Spring、Spring MVC、MyBatis) JDK版本:JDK 1.8 或以上 开发工具:Eclipse 或 IntelliJ IDEA Maven版本:Maven 3.3 或以上 数据库:MySQL 5.7 或以上 此压缩包包含了本毕业设计项目的完整内容,具体包括源代码、毕业论文以及演示PPT模板。 项目配置完成后即可运行,若需添加额外功能,可根据需求自行扩展。 运行条件 确保已安装 JDK 1.8 或更高版本,并正确配置 Java 环境变量。 使用 Eclipse 或 IntelliJ IDEA 打开项目,导入 Maven 依赖,确保依赖包下载完成。 配置数据库环境,确保 MySQL 服务正常运行,并导入项目中提供的数据库脚本。 在 IDE 中启动项目,确认所有服务正常运行。 主要功能简述: 用户管理:系统管理员负责管理所有用户信息,包括学生、任课老师、班主任、院系领导和学校领导的账号创建、权限分配等。 数据维护:管理员可以动态更新和维护系统所需的数据,如学生信息、课程安排、学年安排等,确保系统的正常运行。 系统配置:管理员可以对系统进行配置,如设置数据库连接参数、调整系统参数等,以满足不同的使用需求。 身份验证:系统采用用户名和密码进行身份验证,确保只有授权用户才能访问系统。不同用户类型(学生、任课老师、班主任、院系领导、学校领导、系统管理员)具有不同的操作权限。 权限控制:系统根据用户类型分配不同的操作权限,确保用户只能访问和操作其权限范围内的功能和数据。 数据安全:系统采取多种措施保障数据安全,如数据库加密、访问控制等,防止数据泄露和非法访问。 请假审批流程:系统支持请假申请的逐级审批,包括班主任审批和院系领导审批(针对超过三天的请假)。学生可以随时查看请假申请的审批进展情况。 请假记录管理:系统记录学生的所有请假记录,包括请假时间、原因、审批状态及审批意见等,供学生和审批人员查询。 学生在线请假:学生可以通过系统在线填写请假申请,包括请假的起止日期和请假原因,并提交给班主任审批。超过三天的请假需经班主任审批后,再由院系领导审批。 出勤信息记录:任课老师可以在线记录学生的上课出勤情况,包括迟到、早退、旷课和请假等状态。 出勤信息查询:学生、任课老师、班主任、院系领导和学校领导均可根据权限查看不同范围的学生上课出勤信息。学生可以查看自己所有学年的出勤信息,任课老师可以查看所教班级的出勤信息,班主任和院系领导可以查看本班或本院系的出勤信息,学校领导可以查看全校的出勤信息。 出勤统计与分析:系统提供出勤统计功能,可以按班级、学期等条件统计学生的出勤情况,帮助管理人员了解学生的出勤状况
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值