23种设计模式是基于面向对象的一些编程逻辑思想,无意间看了看《大话设计模式》,我觉得还挺好玩,虽然设计模式我这个阶段确实可以不着急学,但我觉得这些内容挺吸引我的,反正时间也还多,就学着玩玩。而且设计模式真的刷新了我对面向对象的认知,让我知道面向对象还可以这么灵活,还可以这么好玩,所以我觉得,作为后端的,使用面向对象语言(我学的是Java)进行程序设计,学会了这些,应该会对我编程更有帮助。
简单工厂模式概述
简单工厂模式是利用工厂类来实例化一系列对象,如此简化业务代码。
简单工厂模式由工厂角色、抽象产品角色、具体产品角色组成
使用简单工厂模式后,当需要对功能进行修改、增加、删除,主要的业务代码不需要改变:
- 删除只需要在工厂角色中去除其实例化的代码,再删除其具体产品角色
- 增加只需要创建一个具体产品角色,让其实现抽象产品角色的功能,再到工厂角色中增加其实例化的代码即可
- 修改只需要在其具体产品角色中修改相应要修改的功能即可
以餐馆为顾客烹饪菜品为例:
若抽象产品角色为菜品,菜品的具体类型就是具体产品角色。对于餐馆来说,菜品的制作就是菜品的功能。
代码实现:
抽象产品角色(菜品):
/*** 抽象产品角色:菜品,用来表示烹饪,具体烹饪什么,要由实现类决定*/
public interface Cooking {//表示制作菜品String cookingDish(int id);
}
抽象产品角色的定义,要是一个抽象类或接口,以便于具体产品角色来继承或实现它。在其中也要定义具体产品角色必须实现的功能。
具体产品角色(菜品的具体种类):
public class CookingChicken implements Cooking {@Overridepublic String cookingDish(int id) {return "烹饪" + id + "号客户的鸡肉";}
}
public class CookingFish implements Cooking {@Overridepublic String cookingDish(int id) {return "烹饪" + id + "号顾客的鱼";}
}
public class CookingPotato implements Cooking {public String cookingDish(int id) {return "烹饪" + id + "号顾客的土豆";}
}
具体产品角色不要忘了去实现或继承抽象产品角色,并实现其功能。
工厂角色
/*** 简单工厂模式*//*** 工厂类,用其中的静态方法来创建具体的烹饪菜品的任务*/
public class CookingFactory {public static Cooking createCooking(String type) throws Exception {Cooking cooking = null;switch (type){case "鱼":cooking = new CookingFish();break;case "土豆":cooking = new CookingPotato();break;case "鸡肉":cooking = new CookingChicken();break;default:cooking = null;}if (cooking == null) {System.out.println("没有此菜品");throw new Exception("没有此菜品");}return cooking;}
}
创建具体产品角色的对象的方法应该是静态的,因为这个工厂创建的方法是一种可以统一用可以复用的功能,调用它就可以创建对应的具体产品角色。所以不必要先实例化工厂类的对象再调用其工厂方法,用静态方法能简化代码。
以上为例,工厂可以通过不同的type,来判断要创建哪个具体产品角色。在没有找到相应具体产品角色时,也做出相应的异常处理。
主要业务代码(具体使用):
public class Main {public static void main(String[] args) throws Exception {Scanner scan = new Scanner(System.in);System.out.println("输入用户id号");int id = scan.nextInt();System.out.println("输入要点的菜品");String dish = scan.next();Cooking cooking = CookingFactory.createCooking(dish);String result = cooking.cookingDish(id);System.out.println(result);}
}
要获得指定的具体产品角色,调用其工厂类的静态工厂方法,此处调用createCooking方法,并传入具体的菜品类型,就可以返回一个需要的具体产品角色,就可以调用其具体产品角色完成指定功能。
总结
- 简单工厂模式使得主业务代码更为简洁,只需要传入动态的代表具体产品类型的值和调用相应的功能。
- 动态判断的逻辑代码 和 健壮性处理 以及 对象的创建 都封装在底层中,主业务代码只要完成简单的调用即可
- 使得整个项目耦合度低,封装性强,且层次分明,易于阅读。当需要对逻辑进行一些增加、修改、删除,只需要在底层中进行即可。
举的例子可能不是很形象,一些优点的总结也可能有点片面。如有误,望指出。