第一次设计作业
1、要求:某系统日志记录器要求支持多种日志记录方式,如文件记录、数据库记录等;用户可以根据要求动态选择日志记录方式。使用Factory模式来设计;如果系统中增加一个日志记录方式—控制台日志记录(ConsoleLog),类图将如何改变?
代码
// 日志工厂类public abstract class logFactory { abstract log createLog();} // 文件日志工厂类public class FilelogFactory extends logFactory { @Override log createlog() { return new Filelog(); }} // 数据库日志工厂类public class DBlogFactory extends logFactory { @Override log createlog() { return new DBlog(); }} // 日志产品类public abstract class Log { abstract void add(); abstract void delete(); abstract void output();} // 文本日志产品类public class Filelog extends log { @Override void add() {} @Override void delete() {} @Override void query() {}} // 数据库日志产品类 public class DBlog extends log { @Override void add() {} @Override void delete() {} @Override void query() {} }
加入consolelog后:
2、要求:某系统为了改进数据库操作的性能,自定义数据连接对象Connection和语句对象Statement,可针对不同类型的数据库提供不同的连接对象和语句对象;用户可以通过配置文件等方式根据实际需要动态更换系统数据库;使用Abstract Factory模式来设计。
代码
// 数据库抽象工厂类public abstract class DBFactory { public abstract connection createonnection(); public abstract statement createstatement();} // MySql数据库工厂类public class MyDBFactory extends DBFactory { @Override public connection createconnection() { return new Myconnection(); } @Override public statement createstatement() {} return new Mystatement(); }}// OracleSql数据库工厂类public class OracleDBFactory extends DBFactory { @Override public connection createconnection() { return new Oracleconnection(); } @Override public statement createstatement() {} return new Oraclestatement(); }} // 数据库连接抽象产品类public abstract class connection { public abstract void connection();} // 数据库语句抽象产品类public abstract class statement { public abstract void statement();} // MySql数据库连接public class Myconnection extends connection { @Override public void connection() {}} // MySql数据库语句public class Mystatement extends statement { @Override public void statement() {}} // Oracle数据库连接public class Oracleconnection extends connection { @Override public void connection() {}} // MySql数据库语句public class Oraclestatement extends statement { @Override public void statement() {}}
3、要求:KFC套餐是一个复杂对象,一般包括主食(如汉堡、鸡肉卷等)和饮料(如果汁、可乐等)组成部分,不同套餐有不同组成部分;KFC服务员要根据顾客要求,装配这些组成部分,构造一个完整套餐,返回给顾客;使用Builder模式来设计。
代码
// 套餐导演抽象类public abstract class KFCDirector { protected KFCBuilder builder; public KFCDirector(KFCBuilder builder) { this.builder = builder; } public abstract KFCcombo construct();} // 套餐创建者抽象类public abstract class KFCBuilder { protected KFCcombo combo; public KFCBuilder() { this.combo = new combo(); } public combo getcombo() { return combo; } public abstract void buildStaple(); public abstract void buildDrink();} // 套餐创建者具体类public class ComboABuilder extends KFCBuilder { @Override public void buildStaple() {} @Override public void buildDrink() {}} // 套餐产品类public class combo { public void setstaple(){} public void getstaple(){ return combo.staple; } public void setdrink(){} public void getdrink(){ return combo.drink; }}
4、要求:游戏中的地图:包括天空、地面、背景;人物包括人体、服装、装备等组成部分,如采用Builder模式如何设计?
代码
// 地图导演类public class mapDirector { private mapBuilder builder; public mapDirector(mapBuilder builder) { this.builder = builder; } public map construct() { builder.buildSky(); builder.buildGround(); builder.buildBackground(); return builder.getMap(); }} // 地图创建者抽象类public abstract class mapBuilder { protected Map map; public MapBuilder() { this.map = new Map(); } public Map getMap() { return map; } public abstract void buildsky(); public abstract void buildground(); public abstract void buildbackground();} // 沙漠地图创建者具体类public class DesertMapBuilder extends MapBuilder { @Override public void buildsky() {} @Override public void buildground() {} @Override public void buildbackground() {}}