设计模式学习-工厂模式

在学习设计模式之前,首先了解一下多态

1.多态

多态,顾名思义,就是多种形态,在面向对象编程里就是指接口的多种不同的实现方式,鸟会飞,飞机也会飞,超人也会飞,同样是飞,变现出的形态却是不一样的,在程序中的体现就是

public interface ifly{
public abstract void fly();
}
class plane implements ifly{


@Override
public void fly() {
System.out.print("plane fly");
}

}
class bird implements ifly{


@Override
public void fly() {
System.out.print("bird fly");
}

}

.....

那这样做的作用是什么呢?

首先,可以实现代码的复用,这里的复用并不是代码量的减少,而是结构的复用,子类不需要再去思考去添加新的功能调用,只需要去实现接口就可以了,如,超人还会“跑”,那我就去实现“跑”这个接口...在项目开发中,接口的开发往往比子类去实现花费的时间更多。

其次,封装性,这里的封装是指对方法的封装,由父类指针指向子类对象然后在调用父类的某一个方法时,不同的子类对象变现出来的行为是不同的,此时就隐藏的子类的具体实现。

总而言之,多态是程序的结构更清晰,降低耦合度,大大降低了程序的维护。

2.简单工厂

既然是工厂factory,那就会有产品product,在面向对象编程中,product就是对象,而factory就是去创建对象。

首先来看一个经典的例子,在数据库开发的时候,我们使用SQL Server作为数据库,然后设计了一个简单的类sqlDB,里面包含了很多数据库的一些基本操作,如连接、增删改查...系统完成后,感觉很不错,给客户之后,客户突然说,我们这边要改成oracle作为数据库,需要把原来的重新修改一下,拿回来之后,你把之前的sqlDB类慌忙改成oracleDB,里面的连接方法,增删改查、使用这个类的地方全部都要改,自己恨不得重新写一遍~好不容易调试完,过了几天又要改成access的...快要疯了吧!

对于这种情况,最简单的解决方法就是,我们可能用到的类sqlDB、oracleDB、accessDB全部写好,随便你改变需求,改哪个换哪个,这种方法虽然可以解决,但是如果客户

并不要修改,你岂不是做了无用功???对了,那就用刚刚说的接口,定义一个DB接口,包含connect、insert、delete一些抽象函数,sqlDB、oracleDB、accessDB去实现他们,需要那种数据库,我就去实现那种,结构也清晰,也没有累赘,这就是使用了多态,听上去好像很完美了,但是如果在这个系统中,很多地方都使用了数据库的交互,那我修改DB的时候还不是要按个去找new ..DB()...然后修改,那有没有更好的方法,自然就引入了简单工厂。

在这里,sqlDB、oracleDB、accessDB就是product,他们的接口是iproduct,factory需要做的就是去create他们:

class factory{

public static iproduct create(String type){

switch(type){

case "sql":

return new sqlDB;

case "oracle"

...

}

}

}

在使用的时候:

factory myDB = factory.create("sqlDB"); 

但是这样好像还是要去一个一个修改,和之前没什么区别啊,那如果把“sqlDB”改成去读一个配置文件,那样的话,每次只要去修改配置文件,然后添加相应的子类就可以了。

可是简单工厂只是把子类的new..DB()..操作推迟到了工厂类中,并没有什么变化,而且还增大了篇幅。。。

实际上,简单工厂是属于创建型模式,是把创建多态化,有什么好处呢?首先它屏蔽了子类的实例化方法,其次把创建对象和使用对象分割开,这样用户在使用的使用,不需要了解这个子类对象到底是怎么实现的,有哪些参数...优化了软件的结构。
在面向过程的编程中,一般是把底层的功能包装成一个函数,然后高层使用时去调用它,但是如果底层改变了,高层也会改变,往往是牵一发而动全身,这对软件的维护是很不里的,而在面向对象编程中,如果我们把一个类都当成一个个的包装好的函数,而我去使用它,它发生了变化,那么调用它的也会跟着变化,维护起来也很不方便,那怎么让维护的代价最小呢?简单工厂其实就做到了一点,它把对象的创建封装到了一个类中,如果类的构造函数发生了变化,只需要在这个类中修改,无需按个去找new ..DB()..


还有很多理解有偏差,希望随着深入学习,能有更准确的理解!







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值