没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
JAVA PATTERN 学习
1. 单子模式 Singleton:
单子模式的设计思想是类得内部定义一个静态变量,当创建第一个实例时设置改变量.应用程
序直接使用这个静态变量指向的实例就可以了.为了防止应用程序调用构造器 所以构造器
必须为 private . 静态 是为了在类加载时创建了 所需对象 而不用类创建对象..
创建一个类满足:
1.构造器私有
2.用一个私有静态变量引用实例
3.提供一个共有,静态方法获得实例.
主要有两种类型懒汉式和饿汉式.
//懒汉式
public class Singleton{
private void Singleton1(){}
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
private static Singleton instance =null;
public static synchronized Singleton getInstance1(){
if(instance==null){
instance=new Singleton();
System.out.println("this is first produce lazing singleton
object!");
}
return instance;
}
}
//饿汉模式
public class Singleton1 {
private Singleton1() {}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private static Singleton1 instance = new Singleton1();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton1 getInstance() {
System.out.println("your singleton object,I am hungry");
return instance;
}
}
二.工厂模式:
工厂模式主要是为创建对象提供了接口。工厂模式按照《Java 与模式》中的提法分为三
类:
1. 简单工厂模式(Simple Factory)
2. 工厂方法模式(Factory Method)
3. 抽象工厂模式(Abstract Factory)
这三种模式从上到下逐步抽象,并且更具一般性。
还有一种分类法,就是将简单工厂模式看为工厂方法模式的一种特例,两个归为一类。
两者皆可,这本为使用《Java 与模式》的分类方法。
在什么样的情况下我们应该记得使用工厂模式呢?大体有两点:
1.在编码时不能预见需要创建哪种类的实例。
2.系统不应依赖于产品类实例如何被创建、组合和表达的细节
工厂模式能给我们的 OOD、OOP 带来哪些好处呢??
1.1 简单工厂模式
顾名思义,这个模式本身很简单,而且使用在业务较简单的情况下。
它由三种角色组成:
工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在 java 中它往往由
一个具体类实现。
抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在 java 中由接口或者抽
象类来实现。
具体产品角色:工厂类所创建的对象就是此角色的实例。在 java 中由一个具体类实现。
来用类图来清晰的表示下的它们之间的关系.
那么简单工厂模式怎么用呢?我来举个例子吧.
在使用了简单工厂模式后,现在暴发户只需要坐在车里对司机说句:“开车”就可以
了。来看看怎么实现的:
//抽像产品类
public interface Car{
public void drive();
}
//具体产品类BwmCar
public class BwmCar implements Car {
public void drive() {
System.out.println("today Drive BwmCar!!");
}
}
//具体产品类1AudiCar
public class AudiCar implements Car {
public void drive() {
System.out.println("today Drive 1AudiCar!!");
}
}
//具体产品类BwmCar
public class BwmCar implements Car {
public void drive() {
System.out.println("today Drive BwmCar!!");
}
}
//工厂角色类
public class simpleFactory {
//工厂方法
//注意 返回类型为抽象产品角色
public static Car driverCar(String s)throws Exception {
//判断逻辑,返回具体的产品角色给Client
if(s.equalsIgnoreCase("Benz")) return new BenzCar();
else if(s.equalsIgnoreCase("Bmw"))
return new BwmCar();
else if(s.equalsIgnoreCase("Audi"))
return new AudiCar();
else throw new Exception();
}
}
//测试工厂类
public class testFactory {
public static void main(String[] args){
try{
//告诉司机我今天坐奔驰
Car car = simpleFactory.driverCar("benz");
//下命令:开车
car.drive();
}catch (Exception e) {}
}
}
下面我们从开闭原则上来分析下简单工厂模式。当暴发户增加了一辆车的时候,只要
符合抽象产品制定的合同,那么只要通知工厂类知道就可以被客户使用了。那么对于产品
部分来说,它是符合开闭原则的——对扩展开放、对修改关闭;但是工厂部分好像不太理
想,因为每增加一辆车,都要在工厂类中增加相应的商业逻辑和判断逻辑,这自然是违背
开闭原则的
。
1.2: 工厂方法模式.
正如我前面提到的简单工厂模式适用于业务将简单的情况下。而对于复杂的业务环境
可能不太适应阿。这就应该由工厂方法模式.
抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实
现的接口或者必须继承的父类。在 java 中它由抽象类或者接口来实现。
具体工厂角色: 它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具
体产品的对象。在 java 中它由具体的类来实现。
抽象产品角色:它是具体产品继承的父类或者是实现的接口。在 java 中一般有抽象类
或者接口来实现。
具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在 java 中由具体的类
实现。
以下用接到上面一个例子来学习.上面抽象产品类和具体产品类接着用,下面添加抽象工
厂类和具体工厂类
//抽象工厂角色
public interface FactoryMethod {
public Car driverCar();
}
//具体工厂角色BwmFactory
public class BwmFactoryMothod implements FactoryMethod {
public Car driverCar() {
// TODO Auto-generated method stub
return new BwmCar();
}
}
//具体工厂角色AuciFactory
public class AuciFactoryMethod implements FactoryMethod{
public Car driverCar() {
// TODO Auto-generated method stub
return new AudiCar();
}
}
//具体工厂角色BenzFatory
public class BenzFatoryMethod implements FactoryMethod {
public Car driverCar() {
return new BenzCar();
}
}
//测试工厂方法类
public class testFactoryMethod {
public static void main(String[] args)
{
try{
FactoryMethod driver = new BenzFatoryMethod();
Car car = driver.driverCar();
car.drive();
}catch(Exception e){ }
}
}
分析: 工厂方法使用一个抽象工厂角色作为核心来代替在简单工厂模式中使用具体类作为核心。
使用开闭原则来分析下工厂方法模式。当有新的产品(即暴发户的汽车)产生时,只要按照抽
象产品角色、抽象工厂角色提供的合同来生成,那么就可以被客户使用,而不必去修改任何已
有的代码。看来,工厂方法模式是完全符合开闭原则的! 使用工厂方法模式足以应付我们可
能遇到的大部分业务需求。但是当产品种类非常多时,就会出现大量的与之对应的工厂类,这
不应该是我们所希望的。所以我建议在这种情况下使用简单工厂模式与工厂方法模式相结合的
方式来减少工厂类:即对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工
厂模式来实现。 当然特殊的情况,就要特殊对待了:对于系统中存在不同的产品树,而且产
品树上存在产品族(下一节将解释这个名词)。那么这种情况下就可能可以使用抽象工厂模式
了。
小结
让我们来看看简单工厂模式、工厂方法模式给我们的启迪:
如果不使用工厂模式来实现我们的例子,也许代码会减少很多——只需要实现已有的
车,不使用多态。但是在可维护性上,可扩展性上是非常差的(你可以想象一下,添加一辆车
后要牵动的类)。因此为了提高扩展性和维护性,多写些代码是值得的。
1.3:抽象工厂模式
理解一个概念--- 产品族:位于不同产品等级结构中,功能相关联的产品组成的家族。如
BmwCar 和 BenzCar 就 是 两 个 产 品 树 ( 产 品 层 次 结 构 ) , BenzSportsCar 和
BmwSportsCar 就 是 一 个 产 品 族 . 他 们 都 可 以 放 到 跑 车 家 族 中 , 因 此 功 能 有 所 关 联
BmwBussinessCar 和 BenzSportsCar 也是一个产品族.
抽象工厂模式是三个里面最为抽象、最具一般性的。
抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。
而且使用抽象工厂模式还要满足一下条件:
1.系统中有多个产品族,而系统一次只可能消费其中一族产品
2.同属于同一个产品族的产品以其使用。
来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):
抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必
须实现的接口或者必须继承的父类。在 java 中它由抽象类或者接口来实现。
具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的
具体产品的对象。在 java 中它由具体的类来实现。
抽象产品角色:它是具体产品继承的父类或者是实现的接口。在 java 中一般有抽
象类或者接口来实现。
具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在 java 中由具体
的类来实现。
剩余47页未读,继续阅读
资源评论
chaoliu123
- 粉丝: 2
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功