在说简单工厂模式之前首先说一下设计模式的分类以及基本原则.
设计模式分类
总体来说设计模式总共分为三大类:
创建型模式:共5种,工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式
结构性模式:共7种,适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式
行为型模式:共11中,策略模式,模板方法模式,观察者模式,迭代子模式,责任链模式,命令模式,备忘录模式,状态模式,访问这模式,中介模式,解释器模式.
设计模式六大原则
总原则:开闭原则
开闭原则就是说对扩展开放,对更改关闭.在程序需要扩展的时候不去更改原有的代码,而是增加新的代码,实现一个热插拔的效果.所以一句话就是为了是程序的扩展性好,易于维护和升级.
- 单一职责原则
不要存在多余一个导致类变更的原因,也就是说一个类应该只实现一个功能,如果不然,应该把类拆开. - 里氏替换原则(LSP) 是面向对象的基本原则之一,此原则是说任何基类可以出现的地方其子类一定也可以出现.LSP是继承复用的基石,只有当衍生类能够替换掉基类,并且软件功能不受影响时,基类才能真正的被复用,而衍生类也能在基类的基础上增加一些新的功能.里氏替换原则是对开闭原则的补充.实现开闭原则的的关键步骤就是抽象画,而基类与子类的继承关系就是抽象的具体实现.
在里氏替换原则中,子类对父类的的方法尽量不要重写与重载.因为父类定义了一个良好的对外的接口,通过这个接口可以与外界更好的交互.子类不应该随便破坏它. - 依赖倒转原则: 这是开闭原则的基础.主要是面向接口编程,依赖抽象而不依赖具体,写代码用到具体类时,不与具体类交互,而与上层接口交互.
- 接口隔离原则: 每个接口中不存在子类用不到的方法,如果有,则应该将接口分开为两个.
- 最少知道原则: 一个类对自己依赖的对象知道的越少越好,也就是说无论依赖的对象有多复杂,都应该将实现封装在方法的内部,通过public提供给外界,这样当被依赖的对象变化时候,才能最少的影响该类.
- 合成复用原则: 首先使用组合/聚合的方式,而不是使用继承.
简单工厂模式:
简单工厂模式按理来说不属于23中设计模式,但是使用的却挺多的.
简单工厂模式主要有三种实现.
第一种 最普通:
创建共同的接口:1
2
3public interface Send {
public void send();
}
然后有两个类实现这个接口:1
2
3
4
5
6
7
8
9
10
11
12
13public class Send1 implements Send {
public void send() {
System.out.println("我是send1");
}
}
public class send2 implements Send {
public void send() {
System.out.println("我是send2");
}
}
在创建工厂类1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20public class SendFactory {
public Send getProduce(String type){
if("send1".equals(type)){
return new Send1();
}else if("send2".equals(type)){
return new send2();
}else{
System.out.println("输入正确类型");
return null;
}
}
}
//这个是测试
class FactoryTest{
public static void main(String[] args) {
SendFactory sendFactory = new SendFactory();
Send send = sendFactory.getProduce("send1");
send.send();
}
}
这里只需要传入相对应的参数就可以返回相应的类. 但是这样子有点不好就是如果类的种类变多将会使得代码变得难以维护与扩展.
第二种
将创建每个类变成多个方法:1
2
3
4
5
6
7
8public class SendFactoryTwo {
public Send getSend1(){
return new Send1();
}
public Send getSend2(){
return new send2();
}
}
此种方法比第一种方法要更好一些,因为这里通过方法名来返回实例,比普通的要更好一点.
### 第三种
将方法变为静态的.这样不需要建立工厂类就可以调用返回响应的方法.1
2
3
4
5
6
7
8public class SendFactoryTwo {
public static Send getSend1(){
return new Send1();
}
public static Send getSend2(){
return new send2();
}
}
总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建.