一、蛋糕店点餐系统
需求:设计一个蛋糕店点餐系统。
设计一个蛋糕类(Cake),并定义其两个子类(草莓蛋糕【StrawberryCake】和柠檬蛋糕【LemonCake】);再设计一个蛋糕店类(CakeStore),蛋糕店具有点蛋糕的功能。
1、先写好Cake这个类
public class Cake {
String type ="";
public void addMilk(){
}
public void addFlour(){
}
public String getName(){
return type;
}
}
2、草莓蛋糕【StrawberryCake】
public class StrawberryCake extends Cake{
public StrawberryCake() {
}
@Override
public void addMilk() {
System.out.println("给蛋糕加牛奶!");
}
@Override
public void addFlour() {
System.out.println("给蛋糕加面粉!");
}
@Override
public String getName() {
return "草莓蛋糕新鲜出炉!";
}
}
3、柠檬蛋糕【LemonCake】
public class LemonCake extends Cake {
@Override
public void addMilk() {
System.out.println("给蛋糕加牛奶!");
}
@Override
public void addFlour() {
System.out.println("给蛋糕加面粉!");
}
@Override
public String getName() {
return "柠檬蛋糕新鲜出炉!";
}
}
4、蛋糕店
public class CakeStore {
public void welcome(){
System.out.println("欢迎来到蛋糕餐厅!");
System.out.println("-------------------------");
}
public void goodbye(){
System.out.println("-------------------------");
System.out.println("欢迎下次光临!");
}
}
5、客户端
public class Client {
public static void main(String[] args) {
Scanner input =new Scanner(System.in);
CakeStore cakeStore = new CakeStore();
cakeStore.welcome();
System.out.println("请选择蛋糕口味(StrawberryCake/LemonCake)");
String type = input.nextLine();
Cake cake;
cake = CakeFactory.createCake(type);
System.out.println(cake.getName());
cakeStore.goodbye();
// CakeStore cakeStore = new CakeStore();
// Cake cake = cakeStore.createCake(type);
// System.out.println(cake.getName());
}
}
6、蛋糕工厂类
如果需要增加几种蛋糕,需要修改CakeStore代码。如果我们使用工厂来生产对象,我们就只需要和工厂沟通,彻底和对象解耦,因此,工厂模式最大的有点是解耦
public class CakeFactory {
public static Cake createCake(String type) {
Cake cake = null;
if("StrawberryCake".equals(type)){
cake = new StrawberryCake();
}else if("LemonCake".equals(type)){
cake = new LemonCake();
}
cake.addMilk();
cake.addFlour();
return cake;
}
}
二、运行结果
三、总结
工厂模式封装了创建对象的过程,可以通过参数直接获取对象。把对象的创建和业务逻辑层分开,这样以后就避免了修改客户代码,如果要实现新产品直接修改工厂类,而不需要在原代码中修改,这样就降低了客户代码修改的可能性,更加容易扩展。
工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。
当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利,违背了“开闭原则”。