黑马程序员技术交流社区
标题:
来谈谈java中几种常见的设计模式
[打印本页]
作者:
RockLee
时间:
2015-7-2 08:04
标题:
来谈谈java中几种常见的设计模式
设计模式,往往比较重要。它是我们解决问题的好帮手。
我在这里稍微总结一下Java中常见的一些设计模式。
1,单例设计模式
单例设计是Java中最常见的模式之一,,它就是要保证程序里边只有一个对象实例。就好比班上都叫他为班长,是因为得保证班上只有一个班长。
单例设计模式的程序设计思想反应的是Java面向对象思想的封装特性。
就是为了保证只有一个对象实例,我们私有化它的构造函数,对外只提供一些相关的
公共方法来获得对象实例。
单例设计模式的实现主要分为饿汉式和懒汉式
饿汉式是先对类的对象实例化,随着类的加载对象也加载进来缺点是会造成性能的损耗好处是实现简单。
eg:
class SingleDemo1{
static SingleDemo1 sd1 = new SingleDemo1();
private SingleDemo1 () {
System.out.println("haha");
}
public static SingleDemo1 getSingleDemo1(){
return sd1;
}
}
复制代码
懒汉式是只给出变量但是没有对其进行初始化,而把初始化的动作放进了对外提供的公共函数里,其优点是安全性能好但是第一次加载会比较麻烦。
class SingleClassDemo2{
static SingleClassDemo2 sd;
private SingleClassDemo2(){
}
public static SingleClassDemo2 getSingleClassDemo2 (){
if(sd == null){
sd = new SingleClassDemo2();
}
return sd;
}
}
复制代码
2,模板设计模式
模板设计模式的思路是来源于抽象类的一些特点而它的设计思想是:
1,父类只需定义需要使用的方法,其余留个子类来实现。
2,父类提供的方法只定义了一个通用算法,让子类协助。
eg:
public class 设计模式之模板设计 {
public static void main(String[] args) {
正方形 a =new 正方形(9);
a.show();
长方形 b =new 长方形(1.1,8.1);
b.show();
圆形 c = new 圆形(3);
c.show();
}
}
abstract class Method{
abstract double zhouchang();
abstract double mianji();
void show(){
System.out.println("周长是"+zhouchang());
System.out.println("面积是"+mianji());
}
}
class 正方形 extends Method{
double d;
正方形(double d){
super();
this.d =d;
}
double zhouchang() { return 4 *d;}
double mianji() {return d*d;}
}
class 长方形 extends Method{
double a;
double b;
长方形(double a,double b){
super();
this.a =a;
this.b =b;
}
double zhouchang() { return 2 *(a+b);}
double mianji() {return a*b;
}
}
class 圆形 extends Method{
final double PI = 3.14;
double r;
圆形(double r){
super();
this.r =r;
}
double zhouchang() { return 2 *PI*r;}
double mianji() {return PI*r*r;}
}
复制代码
3,简单工厂设计模式主要是采用了Java语言中的接口的实现和多态的思想方法。
通过接口来定义类里面的具体规则而不关心类内部数据和其方法的实现屏蔽了不同子类实现的差异,提高了代码的扩展性和可维护性。
eg
package 一些重点;
/*
* 简单工厂设计模式屏蔽了不同子类实现的差异,提高了代码的扩展性和可维护性。
*/
public class 设计模式之简单工厂设计模式 {
public static void main(String[] args) {
Factory fac = new Factory();
Phone a = new Iphone();
Phone b = new Huawei();
Phone c = new Xiaomi();
fac.product(c);
}
}
interface Phone{
abstract public void show();
}
class Iphone implements Phone{
@Override
public void show() {
System.out.println("iphone");
}
}
class Xiaomi implements Phone{
@Override
public void show() {
System.out.println("Xiaomi");
}
}
class Huawei implements Phone{
@Override
public void show() {
System.out.println("Huawei");
}
}
class Factory {
public static void product(Phone p){
if(p instanceof Iphone){
p.show();
}
else if(p instanceof Xiaomi){
p.show();
}
else if(p instanceof Huawei){
p.show();
}
else
System.out.println("没有此型号的手机");
}
复制代码
4,适配器模式:使用一个现成的类但是它的接口又不完全符合你的要求,可以考虑采用适配器模式
* 比如以下问题:假设一个窗口接口有变大,变小,关闭功能但是我们只想用关闭功能该怎么用?
我们可以考虑这样解决
public class 设计模式之适配器模式 {
public static void main(String[] args) {
myWindows mywindows = new myWindows();
mywindows.close();
}
}
interface Windows{
abstract public void max();
abstract public void min();
abstract public void close();
}
class interaptWindows implements Windows{
@Override
public void max() {
}
@Override
public void min() {
}
@Override
public void close() {
}
}
class myWindows extends interaptWindows{
public void close(){
System.out.println("窗口关闭");
}
复制代码
作者:
micro_hx
时间:
2015-7-2 08:57
我觉得最难就是动态代理了。。。。。
作者:
xuhao3622603
时间:
2015-7-2 09:02
装饰设计模式呀,多重要的东西
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2