详解java设计模式(二)之工厂模式上篇(创建型)

学习设计模式最重要的事是如何选择应用场合。我们平时就要多思考为什么要使用这种设计模式?这样才能在解决问题时,合适的选择设计模式。

一.工厂模式初识

1.为什么使用工厂模式
平时我们在创建对象时,一般都是直接使用关键词new一个实例对象,并将需要的构造参数传入,这就要求我们的客户必须了解对象的细节才能完成对象的创建工作。这样会导致紧耦合,不利于程序的扩展性和维护。

public class car{
private String name="";
private int id=0;
public car(String name,int id){
this.name=name;
this.id=id;
}
public void main(String []args){
car c=new car("baoma",123);
}
}

如果我们在程序其他地方使用该对象的使用都需要new对象,这不仅暴露了程序实现的细节,同时也不利于后期维护。一旦我们需要修改该对象的构造函数则需要在它使用的地方全部改写,这样的代价是很大的。

2.工厂模式的应用场景(非常重要)
1)在编码时不能预见需要创建哪种产品类的实例
2)系统不应依赖与产品类实例如何被创建、组合和表达的细节。

3.设计模式之工厂模式参考资料

设计模式之工厂模式
二.工厂模式分类和区别

1.工厂模式主要分为三类:
1)简单工厂(Simple Factory)
2) 工厂方法(Factory Method)
3) 抽象工厂(Abstract Factory)
这3种模式是从上到下逐步抽象的过程。

2.区别
1)简单工厂(静态工厂):
一个抽象产品类:可以派生出多个具体产品类
一个具体工厂类:负责创建多个具体产品类
2)工厂方法模式(升级版的简单工厂):
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品类的实例。
3)抽象工厂模式:(本模式留在下篇讲)
多个抽象产品类:每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类:可以派生出多个具体工厂类。
每个具体工厂类可以创建多个具体产品类的实例。
3)区别:
简单工厂没有抽象工厂,而其他两种模式
工厂方法只有一个抽象产品类,而抽象工厂模式多多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

三.工厂方法的改进之路
我们这里只讲解简单工厂和工厂方法这两种模式,最后一种留待下次讲解。
我们知道这2种模式的抽象产品和具体产品类都是一样的实现过程。这里我就直接先把共同的贴在下面。我们重点是关注这2种模式是如何通过工厂创建对象的。
我们在网页分析中经常需要下载网页对应的内容来进行解析,但是不同的网站对爬虫的策略是不同的,有些是不要求登录的,有些是要求必须模拟登录的。所以我们定义了一个下载器接口,使得对应不同需求,我们使用不同的方案来解决问题。(符合开闭原则)
1.抽象产品-下载器接口

public interface DownLoader{
//下载对应url的页面内容
public String getContent(String url);
}

2.具体产品实现类

1) jsoup下载对应网页内容

public class JsoupDownLoader{
@override
public String getContent(String url){
String content="jsoup download the page";
System.out.println(content);
return content;
}
}

2)httpclient下载对应网页内容

public class HttpClientDownLoader{
@override
public String getContent(String url){
String content="http client download the page ";
System.out.println(content);
return content;
}
}

3.工厂模式实现方法
1)简单工厂(静态工厂)

public class DownLoaderFactory{
//根据类型进行创建相应的对应
public enum downLoaderType{
Jsoup,HttpClient
}
public static DownLoader getInstance(downLoaderType type){
switch(type){
case Jsoup:return new JsoupDownLoader();
case HttpClient :return new HttpClientDownLoader();
}
}
}

由于该类工厂通常使用static关键词,故又称为静态工厂。通过这样我们明显可以看出虽然封装了对象创建的过程,但是工厂类不符合开闭原则,当我们增加一种下载器产品,那么我们便需要修改代码,这其实违背了开闭原则(扩展开放,修改封闭)。
2)工厂方法
修改简单工厂,使得满足开闭原则(oo)。这时我们只需要对工厂进行抽象,每个对应的工厂负责创建一种产品即可。

工厂接口如下:

public interace Factory{
//创建并返回下载器
public  DownLoader getDownLoader();
}

工厂实现如下:

//Jsoup下载器工厂
public JsuopFactory implements Factory{
public DownLoader getDownLoader(){
return new JoupDownLoader();
}
}
//httpclient下载器工厂
public HttpClientFactory implements Factory{
public downLoader getDownLoader(){
return new HttpClientDownLoader();
}
}

虽然工厂方法与简单工厂相比,代码量变大了,但是符合oo原则,可扩展性提高了。但是工厂方法的缺点是,如果产品具体实现类太多,导致工厂方法必须创建大量的工厂,相比之下简单工厂的代码量就很少了。所以当我们设计程序时,可以通过简单工厂和工厂方法结合的方式来设计工厂模式。

四 未完待续

下篇重点讲解抽象工厂模式,我们实际开发中,前2种工厂模式最常见,但在大型项目开发中,需要用到抽象工厂模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值