用java写的几段代码----------------- 假设是一个人选车的案例
第一次没钱-------------选了一辆摩托车
第二次赚了一点钱了-------------选了一辆长安汽车
第三次赚了很多钱-------------选了一辆奔驰汽车
第四次。。。。。。。。
第五次。。。。。。。。。
把这个买车过程(“车”)抽象出来(我这里是为了理解单例模式“只能买一辆“同类型的车,当然不用单例模式你可以"买多辆")
下面是具体的代码 有错的地方请指出来 感激不尽!
/**
* 多态(多态的表现)
* 1.必须继承
* 2.重写父内方法
* 3.父内引用指向子内对象
*/
public class MyTest {
/**
* @param args
*/
public static void main(String[] args) {
Person person = new Person();
System.out.println("请输入要选择车的车名,按回车结束");
Scanner input = new Scanner(System.in);
while(true){
String carName = input.next();
Car car = CarFactory.selectCar(carName);
if(car == null) continue;
person.drive(car);
break;
}
System.out.println("选车结束");
}
}
/**
*汽车(把三种车抽象出来)
*/
public abstract class Car {
//抽象方法(不能有方法体) 子类必须重写
public abstract void run();
//普通方法(要有方法体) 子类可以重写 也可以不重写
public void drive(String carName){};
}
/**
* 摩托车(单例模式只在内的内部实例化一个对象)
*/
public class Motorcycle extends Car{
private int speed = 60;
/**防止外部实例化*/
private Motorcycle(){}
/***
* 用一个静态内部类来实现防止多线程同步造成实例化多个对象
*/
private static class InstanceMotorcycle {
private static final Motorcycle MOTORCYCLE = new Motorcycle();
}
public static Motorcycle getInstance(){
return InstanceMotorcycle.MOTORCYCLE;
}
@Override
public void drive(String carName){
System.out.println(carName);
}
@Override
public void run(){
System.out.println("车速"+speed);
}
}
/**
*长安汽车 (单例模式只在内的内部实例化一个对象)
*/
public class Chana extends Car{
private int speed = 80;
/**防止外部实例化*/
private Chana(){}
/***
* 用一个静态内部类来实现防止多线程同步造成实例化多个对象
*/
private static class InstanceChana {
private static final Chana CHANA = new Chana();
}
public static Chana getInstance(){
return InstanceChana.CHANA;
}
@Override
public void drive(String carName){
System.out.println(carName);
}
@Override
public void run(){
System.out.println("车速"+speed);
}
}
/*** 奔驰汽车 (单例模式只在内的内部实例化一个对象)*/
public class Bendz extends Car{
private int speed = 120;
/**防止外部实例化*/
private Bendz(){}
/**** 用一个静态内部类来实现防止多线程同步造成实例化多个对象*/
private static class InstanceBendz {
private static final Bendz BENDZ = new Bendz();
}
public static Bendz getInstance(){
return InstanceBendz.BENDZ;
}
@Override
public void drive(String carName){
System.out.println(carName);
}
@Override
public void run(){
System.out.println("车速"+speed);
}
}
/****工厂(把实体对象抽象出来,放回父类)+单例单例模式 类专门负责生产汽车*/
public class CarFactory {
/*** 获得产品实例*/
public static Car selectCar(String carName){
//这里就是多态的表现 第3点 (父内引用指向子内对象)if(carName.equals("Motorcycle")){
return Motorcycle.getInstance();
}
else if(carName.equals("Chana")){
return Chana.getInstance();
}
else if(carName.equals("Bendz")){
return Bendz.getInstance();
}
System.out.println("对不起,这种车不存在!");
return null;
}
}
/**
*人 使用汽车
*/
public class Person {
public Person(){
}
public void drive(Car car){
car.run();
}
}
以上就是对这两种模式,以及多态的理解,感谢浏览!