今天看了设计模式的第一个,简单工厂模式,那么就把我理解的简单工厂模式简单描述一下吧。
问题描述:
在java中,没有学过设计模式的时候我们一般是如何实现接口的呢。大概应该都是像如下描述的使用吧:
假设有一个接口叫api,然后有一个实现类叫Impl实现了它,在客户端怎么用这个接口呢,我们一般的做法都是在客户端创建一个Impl的实例,把它赋值给一个Api接口类型的变量,然后客户端就可以通过这个变量来操作接口的功能了,此时结构如图:
代码如下:
1,首先定义接口
/**
*某个接口,没有具体功能
*/
public interface Api{
public void test(String s);
}
2,定义实现类Impl
public class Impl implements Api{
public void test(String s){
system.out.println("简单工厂模式s="+s);
}
}
3,定义客户端Client
public class Client{
public static void main(String[] args){
Api api = new Impl();
api.test("第一次写博客");
}
有何问题:
接口的目的是封装隔离,而上面的代码中,客户端不仅知道了接口,还知道了实现接口的类。而我们的目的是应该让客户端根本就不知道实现接口的类Impl。而我们知道,接口是不允许直接 new api()的。
解决方法:
这里,我就介绍一下简单工厂设计模式。
1,定义: 提供一个创建对象实例的功能,而不关心它的具体实现,被创建的实例的类型可以是接口,可以是抽象或者是具体的类。
2,简单工厂来解决问题的思路分析上面的问题,虽然不能让模块外部知道内部的具体实现,但是模块内部是可以知道实现类的,而且创建接口是需要具体实现类的。
那么就在模块内部创建一个类,在这个类里面创建接口,把创建好的接口返回给客户端。
这样,外部客户端就只需要根据这个类来获取相应的接口对象,然后就可以操作接口定义的方法。这样的对象称为简单工厂factory。这样一来,客户端就可以通过 factory来获取需要的接口对象,然后调用接口的方法来实现需要的功能。并且不需要关心实现接口的类。简单工厂的结构:
api:定义客户所需要的功能接口。
Impl: 具体实现接口的类,可能有多个factory:工厂,选择合适的类来创建api接口对象。
client: 客户端,通过factory来获取api对象,面向接口编程
代码:
api和implA和之前的相同,多一个implB实际上也只是多了一个实现类而已。
factory的代码:
public class Factory{
public static Api getApi(int type){
Api api = null;
if(type == 1){
api = new implA();
}
if(type == 2){
api = new implB();
}
return api;
}
}
Client如下:
client如下:
public class client {
public static void main(String[] args){
Api api = Factory.getApi(1);
api.test("使用工厂了");
}
}
总结:工厂模式就是让我们不必知道接口的实现类,保证了java的封装性
![]()
![]()