java 工厂模式与多态_工厂模式、单例模式,以及oop中对多态的理解

用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();

}

}

以上就是对这两种模式,以及多态的理解,感谢浏览!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值