- 何为设计模式?
借用鲁迅的话,世界上本没有设计模式,用的人多了变成了设计模式。事实是设计模式是无数远古前辈大佬总结出来的一种编程的规范或者思想。四人组( Gang of Four ),简称 GoF ,分别是 Erich Gamma, Richard Helm , Ralph Johnson 和 John Vlissides 。在 95年的时候整理归纳 23 种最常用的设计模式并会变成一本书 Design Patterns: Elements of Reusable Object-Oriented Software 就是:《设计模式:可复用面向对象软件的基础》 。对于现在来说,设计模式也就可以指代上面说的23种设计模式的集合了。
- 何为静态?
先抛开Java语法中的static关键字不提
在Java里运行状态中的静态,动态有这样的一种含义:
- 静态:在代码运行时,程序不能改变代码的结构,行为。所有逻辑都会按照所写代码执行,不受用户输入之类的外界因素影响。在Java里也可以简单的理解为,所有的对象都是写死的类,在最初期的开发中,我们几乎所有的代码都是静态的。
- 动态:在代码运行时,程序可以改变代码的结构,行为。比如通过反射机制根据用户的输入或者配置文件动态的加载一些类(例如数据库驱动)。比如Spring经典的依赖注入与AOP。
-
何为静态工厂模式:
简而言之,静态工厂模式的作用是提供一个用于生产具有相同特征(比如继承自某个类,实现某个接口等)类的实例的工厂类。
在这个类里,有一个静态方法,会根据传入 参数决定生产哪个类(因为是静态的代码,所以这里的类需要预先设置好,即调用此方法的的时候只能在预设的几个类里面挑选)的实例,生产什么样的实例。首先从字面上看,他可以分三部分:静态,工厂,和模式。
- 静态就是上面说的,静态工厂模式不具备动态特性,所有的逻辑,行为,程序结构均在代码编写时就已经确定。体现在此涉及模式里就是所有的生成实例的类型均会预设好。
- 工厂,顾名思义就是生产类实例的一种类。比方说一个厂子里生产两款手机,两款手机又有中高低配置。就可以将手机的型号与具体配置作为‘参数’传入工厂,由工厂的流水线,也就是静态生产方法去根据参数生产出手机的实例。
当然模式就指这是一个经典的设计模式,不在赘述。
-
代码举例:
1、工厂类
package com.tiddar.javabasic.designpattern.factory;
/**
* 工厂类,product根据出传入手机的牌子的字符串决定生产继承于Phone的Xiaomi还是Iphone,并设置它的ram
*
*/
public class PhoneFactory {
public static Phone product(String model,int ram){
if(model.equals("Xiaomi")){
Phone phone = new Xiaomi();
phone.ram = ram;
return phone;
}else if(model.equals("Iphone")){
Phone phone = new Iphone();
phone.ram = ram;
return phone;
}
return null;
}
public static void main(String[] args) {
Phone phone = PhoneFactory.product("Xiaomi",200);
phone.call();
}
}
2、三个产品类
package com.tiddar.javabasic.designpattern.factory;
/**
* 手机的父类,抽象出手机的共有特性
*/
public class Phone {
public int ram;
public void call(){
System.out.println(this.ram+"Phone can call");
}
}
package com.tiddar.javabasic.designpattern.factory;
/**
* iphone类
*/
public class Iphone extends Phone{
@Override
public void call(){
System.out.println(this.ram+"apple can call");
}
}
package com.tiddar.javabasic.designpattern.factory;
/**
* 小米手机类
*/
public class Xiaomi extends Phone {
@Override
public void call(){
System.out.println(this.ram+"Xiaomi can call");
}
}