设计模式并非软件行业所独有,而是起源于建筑行业,我们常说的设计模式主要有23种,不过最常用的几种模式有以下几个:
1,单例模式:确保一个类在内存中只拥有一个实例,以保证对象唯一性!实现单例模式的步骤很简单:
1.1构造函数私有化。
1.2在该类中自己实例化一个对象
1.3提供一个共有的方法来供外界程序访问该对象
代码如下:
public class Student{
private Student(){
}
private static Student student = null; //懒汉式单例:在方法被调用时实例化对象
public static Student getInstance(){
if(student == null){
return new Student();
}
return student;
}
}
也可以这样写:
private static final Stuent student = new Student(); //饿汉式,在类被加载时自动实例化
public static Student getInstance(){
return student;
}
2,简单工厂模式:当有多个类都实现了同一个接口或父类时,可以使用工厂类来实例化对象
既然是工厂模式,那么肯定有工厂类,该类的作用就是根据传入不同的参数来实例化对象。
工厂类一般都提供一个返回值为 static并且返回类型为父类或父接口,至于为什么要这样,原因很简单,因为这就是面向对象三大特性中的 多态原理,
父类引用指向子类对象!
package com.factory;
import java.util.Scanner;
interface Fruit{
public void grow(); //生长
public void pick(); //采摘
}
class Apple implements Fruit{
public void grow(){
System.out.println("苹果在生长。。");
}
public void pick(){
System.out.println("摘苹果。。");
}
}
class Orange implements Fruit{
public void grow(){
System.out.println("橘子在生长。。");
}
public void pick(){
System.out.println("摘桔子。。");
}
}
class Factory{
public static Fruit getFruitInstance(String type){
Fruit fruit = null;
if(type.equals("Apple")){
fruit = new Apple();
}else if(type.equals("Orange")){
fruit = new Orange();
}else{
System.out.println("NullPointException!");
return null;
}
}
}
public class Test{
public static void main(String [] args){
System.out.print("请输入水果类型:");
Scanner input = new Scanner(System.in);
Fruit fruit = Fruit.getFruitInstance(input.next);
if( null != fruit){
fruit.grow();
fruit.pick();
}else{
System.out.println("无法找到该类型。。");
}
}
}
至此一个完整的简单工厂模式就完成了,不过仔细发现该工厂类还存在以下问题:
如果要加入新的功能,比如我现在要再加入一个水果类,Banana(香蕉),则该工厂类又要修改代码,这样违背了开闭原则,那么如何解决这个问题呢,请看下面:
class Factory{
Fruit fruit = null;
try{
fruit =(Fruit) Class.forName("com.factory."+type).newInstance();
}catch(Exception e){
}
return fruit;
}
Class 类提供了一个forName().newInstance()方法,该方法可以根据包名+类名自动实例化对象!
经过改进工厂类的代码,不论加入什么样的类,工厂类都无须改变,这样加实现了 开闭原则,对修改关闭,对增加开放!