工厂方法的目的:
将实现类和实体类中间多加一层,使实体类统一调度,而我们只需要接触那个中间层,使实现类和实体类解耦(简单说就是在main函数里不要new实体类的对象,由创建该对象的工厂去控制,这时候new的是工厂,而不是main)
D:.
├─method
│ Consumer.java
│ Filco.java
│ FilcoFactory.java
│ KeyBoard.java
│ KeyBoardFactory.java
│ Leopold.java
│ LeopoldFactory.java
│
└─simple
Consumer.java
Filco.java
KeyBoard.java
KeyBoardFactory.java
Leopold.java
简单工厂模式
简单工厂就是,将创建对象的地方从main移到了工厂类里面,这样我们可以统一调度而非在main函数里一个一个new对象
package com.cai.factory.simple;
public class Consumer {
public static void main(String[] args) {
KeyBoard F = KeyBoardFactory.getKeyboard("F");
KeyBoard L = KeyBoardFactory.getKeyboard("L");
F.name();
L.name();
}
}
package com.cai.factory.simple;
public interface KeyBoard {
void name();
}
package com.cai.factory.simple;
public class KeyBoardFactory {
public static KeyBoard getKeyboard(String keyboard){
if ("F".equals(keyboard)){
return new Filco();
} else if ("L".equals(keyboard)) {
return new Leopold();
} else {
System.out.println("???");
return null;
}
}
}
package com.cai.factory.simple;
public class Filco implements KeyBoard{
@Override
public void name() {
System.out.println("圣手二代");
}
}
package com.cai.factory.simple;
public class Leopold implements KeyBoard{
@Override
public void name() {
System.out.println("FC660M");
}
}
工厂方法模式
通过去创建一个新的工厂来获取所需的对象,加的是工厂而不是所需的对象,这样子,符合了开闭原则,需要多加一个对象的时候,就多创建类,而不是在原来的代码基础上修改了
public class Consumer {
public static void main(String[] args) {
KeyBoard f = new FilcoFactory().getKeyBoard();
KeyBoard l = new LeopoldFactory().getKeyBoard();
f.name();
l.name();
}
}
package com.cai.factory.method;
public interface KeyBoard {
void name();
}
package com.cai.factory.method;
public interface KeyBoardFactory {
KeyBoard getKeyBoard();
}
package com.cai.factory.method;
public class FilcoFactory implements KeyBoardFactory{
@Override
public KeyBoard getKeyBoard() {
return new Filco();
}
}
package com.cai.factory.method;
public class LeopoldFactory implements KeyBoardFactory{
@Override
public KeyBoard getKeyBoard() {
return new Leopold();
}
}
package com.cai.factory.method;
public class Filco implements KeyBoard {
@Override
public void name() {
System.out.println("圣手二代");
}
}
package com.cai.factory.method;
public class Leopold implements KeyBoard {
@Override
public void name() {
System.out.println("FC660M");
}
}
总结
对于
设计模式,有7大原则
开闭原则
里氏替换原则
依赖倒置原则
单一职责原则
接口隔离原则
迪米特法则
合成复用原则
简单工厂模式不符合开闭原则,但是实际上较常使用,工厂方法模式虽然符合了开闭原则,但是维护代码麻烦,代码量多
从狂神那里看的,在这些地方用了工厂模式
- JDK中Calendar的getInstance方法
- JDBC中的Connection对象的获取
- Spring中IOC容器创建管理bean对象
- 反射中Class对象的newlnstance方法
我有空去看一看,有看的话,会再发博客的