写的项目进入了维护阶段,闲下来就发现自己的基础知识薄弱到爆,最近打算好好研究一下Java基础,首先选择的就是Java的设计模式,总觉得自己对于这个部分的应用不是很熟练平时写代码的时候想的也不够深入,现在正好有时间就要静下心来自己好好研究一下。
对于Java的设计模式,我相信用Java语言的都不陌生,但真正用到的时候可能用的就不那么精了,我做Android开发,所以一般常常听到的就是适配器模式、工厂模式、单例模式、观察者模式。但是Java还有很多我没有涉及过的各种模式。
一、Java的设计模式总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
其实还有两类:并发型模式和线程池模式
二、设计模式的原则
可参考http://www.uml.org.cn/sjms/201211023.asp
http://blog.csdn.NET/cq361106306/article/details/38708967
先来看看创建型模式中的工厂方法模式:
工厂方法模式属于工厂模式的一种,工厂模式包括简单工厂模式、工厂方法模式、抽象工厂模式,而简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类所以 GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。
1、简单认识一下工厂方法模式:
工厂方法模式其用意是定义一个创建产品对象的工厂机考,将实际创建工作推迟到子类中。
工厂方法模式的实质是“定义一个创建对象的借口,但让实现这个接口的类来决定实例化那个类”
工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。
工厂方法模式的角色结构:
public abstract class basefactory { abstract humam creatHuman();}
2)具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象(通过调用它实现的抽象方法来来获取具体的实体类bean,具体工厂角色不唯一,可以有多个具体工长生产具体产品,一个类型的具体工厂生产一类具体产品)
public class creathuman extends basefactory { @Override
human creatHuman() {
System.out.print("creatHuman successful");
return new student();
}
}
弊端:可以看出工厂方法的加入,使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的 。 可以考虑使用简单工厂模式与工厂方法模式相结合的方式来减少工厂类(具体工厂角色)
//抽象产品角色
public interface human {
void speak();
}
4)具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。(实现抽象产品角色接口的类,实体类bean具体属性方法,具体产品角色不唯一)
- public class student implements human {
- @Override
- public void speak() {
- System.out.print("student can speak");
- }
- }
-
//测试
public class test {
public static void main(String[] args) {
creathuman factory = new creathuman();
human human = factory.creatHuman();
human.speak();
}
}//输出结果:student can speak
1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,用来创建产品(用Java的一个具体类来实现)
2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。
3) 具体产品角色:工厂类所创建的对象就是此角色的实例。在Java中由一个具体类实现。
***************************************************************************************
抽象工厂模式:
参考http://baike.sogou.com/v4738637.htm?fromTitle=%E6%8A%BD%E8%B1%A1%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F,http://laughingchs.iteye.com/blog/1169986<br>
它的角色和工厂方法的角色一致
代码:
//抽象工厂类
public abstract class AbstractFactory {
public abstract Vehicle createVehicle();
public abstract Weapon createWeapon();
public abstract Food createFood();
}
//具体工厂类,其中Food,Vehicle,Weapon是抽象类,
public class DefaultFactory extends AbstractFactory{
@Override
public Food createFood() {
return new Apple();
}
@Override
public Vehicle createVehicle() {
return new Car();
}
@Override
public Weapon createWeapon() {
return new AK47();
}
}
//测试类
public class Test {
public static void main(String[] args) {
AbstractFactory f = new DefaultFactory();
Vehicle v = f.createVehicle();
v.run();
Weapon w = f.createWeapon();
w.shoot();
Food a = f.createFood();
a.printName();
}
}
在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式
比较:
工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
感谢前辈们的分享!!!