面向对象及工厂模式和单体模式的简单介绍

首先,我们来看一个简单的例子,我们用必胜客的pizza来做个例子

首先定义一个interface,抽象出生产比萨的过程。

Pizza.java
  1. public interface Pizza {   
  2.     public void prepare();   
  3.   
  4.     public void bake();   
  5.   
  6.     public void cut();   
  7.   
  8.     public void box();   
  9. }  

然后由各种具体的pizza实现它

香荤至尊比萨

MeatPizza.java

  1. public class MeatPizza implements Pizza {   
  2.     public void prepare() {   
  3.         System.out.println("香荤至尊开始准备了");   
  4.     }   
  5.   
  6.     public void bake() {   
  7.         System.out.println("香荤至尊开始烘烤");   
  8.     }   
  9.   
  10.     public void cut() {   
  11.         System.out.println("香荤至尊切咯");   
  12.     }   
  13.   
  14.     public void box() {   
  15.         System.out.println("香荤至尊打包");   
  16.     }   
  17.   
  18. }  
金枪鱼比萨
TunaPizza.java
  1. public class TunaPizza implements Pizza {   
  2.     public void prepare() {   
  3.         System.out.println("金枪鱼开始准备了");   
  4.     }   
  5.   
  6.     public void bake() {   
  7.         System.out.println("金枪鱼开始烘烤");   
  8.     }   
  9.   
  10.     public void cut() {   
  11.         System.out.println("金枪鱼切咯");   
  12.     }   
  13.   
  14.     public void box() {   
  15.         System.out.println("金枪鱼打包");   
  16.     }   
  17. }  
夏威夷比萨
HawaiianPizza.java
  1. public class HawaiianPizza implements Pizza{   
  2.     public void prepare() {   
  3.         System.out.println("夏威夷开始准备了");   
  4.     }   
  5.   
  6.     public void bake() {   
  7.         System.out.println("夏威夷开始烘烤");   
  8.     }   
  9.   
  10.     public void cut() {   
  11.         System.out.println("夏威夷切咯");   
  12.     }   
  13.   
  14.     public void box() {   
  15.         System.out.println("夏威夷打包");   
  16.     }   
  17. }  

我们利用多态为我们提供的接口与实现分离,改善程序的组织架构及可读性

下边的代码我们可以看到我们完全可以忘记掉对象类型(type)

  1. public class Test {   
  2.     public static Pizza orderPizza (String type){   
  3.         Pizza pizza = null;   
  4.         if (type.equals("Meat"))   
  5.         pizza = new MeatPizza();   
  6.         else if (type.equals("Tuna"))   
  7.         pizza = new TunaPizza();   
  8.         else if (type.equals("Hawaiian"))   
  9.         pizza = new HawaiianPizza();   
  10.         pizza.prepare();   
  11.         pizza.bake();   
  12.         pizza.cut();   
  13.         pizza.box();   
  14.         return pizza;   
  15.     }   
  16.     public static void main(String[] args) {   
  17.         System.out.println("金枪鱼比萨");   
  18.         Test.orderPizza("Tuna");   
  19.         System.out.println("香荤至尊比萨");   
  20.         Test.orderPizza("Meat");   
  21.         System.out.println("夏威夷比萨");   
  22.         Test.orderPizza("Hawaiian");   
  23.     }   
  24. }  

在这里,我先把这个程序的执行结果帖上,看能不能理解

金枪鱼比萨
金枪鱼开始准备了
金枪鱼开始烘烤
金枪鱼切咯
金枪鱼打包
香荤至尊比萨
香荤至尊开始准备了
香荤至尊开始烘烤
香荤至尊切咯
香荤至尊打包
夏威夷比萨
夏威夷开始准备了
夏威夷开始烘烤
夏威夷切咯
夏威夷打包

 

可能大家无法理解编译器如何知道这个reference(引用)指向的是derived class而不是base class呢?其实编译器是不知道的,其实是binding的缘故,而且是执行期绑定(run-time binding)

这就是多态性的一个重要方面——向上转型(upcasting)

我为什么要给出这个例子呢?还有别的用途,就是想说明一种设计模式——工厂模式

这个例子给出了一个工厂方法,orderPizza,借助这个方法可以生成不同的对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值