本章内容 1. 简单工厂模式(也叫静态工厂模式),2.工厂方法模式,3.抽象工厂模式
- 特别建议大家可以敲下设计模式的代码,看上去简单,但是敲出来心里会很踏实。
靠靠靠,觉得真无聊?请直接往下翻到代码和代码中的注释,看完后在来看学术性的东西吧....
- 什么是工厂模式?
工厂,大家都知道富士康连跳,啊呸!内个...富士康就是生产的根据别人的订单,用模具来生产别人需要的的嘛!那其中“模具”就相当面向对象语言JAVA中具体的类【如果知道面向对象,那么类不就是就代表了一类对象的模板,嗯?】
对应到下面代码就是Audi.class【奥迪汽车生产模板】
Benz.class【奔驰汽车生产模板】。那么问题来了:“BMW的中文车名是?” 对 “别摸我!”。我废话真多 ;
富士康的生产对应的就是SimpleFactory.class。
那用在设计模式中,那就是用来接收别人的委托,生产委托人类需要的对象。我猜你心里肯定在骂BB了半天,终于讲到重点了!所以还不赶紧那个本子记下来
下面一大堆废话可以看看,也可以看完代码之后再看,会获益匪浅:
- 工厂方法模式(英语:Factory method pattern)是一种实现了“工厂”概念的面向对象设计模式。就像其他创建型模式一样,它也是处理在不指定对象具体类型 的情况下创建对象的问题。工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。”
为什么用工厂模式
创建一个对象常常需要复杂的过程,所以不适合包含在一个复合对象中。创建对象可能会导致大量的重复代码,可能会需要复合对象访问不到的信息,也可能提供不了足够级别的抽象,还可能并不是复合对象概念的一部分。工厂方法模式通过定义一个单独的创建对象的方法来解决这些问题。由子类实现这个方法来创建具体类型的对象。实现了依赖的反转。
1.简单工厂模式
重点:没有满足传说中的开闭原则(OCP),所以他扩展需要修改代码
- 测试调用
public class Client{
//调用工厂模式,只需要知道需要的创建的类型
public static void main(String[] args) {
Car car = SimpleFactory.getCar("audi");
car.bebe();
}
}
- 简单工厂模式
/**
* 简单工厂模式
*/
public class SimpleFactory{
//用于生产的生产方法
public static Car getCar(String type) {
if("audi".equals(type)) {
return new Audi();
} else if("benz".equals(type)) {
return new Benz();
} else {
return null;
}
}
}
//需要创建的对象
interface Car{
void bebe();
}
class Audi implements Car{
public void bebe(){
System.out.println("audi bebe");
}
}
class Benz implements Car{
public void bebe(){
System.out.println("benz bebe");
}
}
2. 工厂方法模式
工厂方法模式满足拥有了简单工厂模式的优点,同时又满足了开闭原则,易扩展;
UML图
没有依赖关系的UML
image.png
- 加上依赖后的UML
杂乱了许多,但这样带来的好处是容易扩展;如需扩展,不用修改代码,增加Mylog接口的实现类,增加LogFactory接口的实现类,就可以实现扩展!而这是简单工厂模式不能实现的。
image.png
具体代码分析
需要生产的产品
interface Mylog{
void print();
}
//具体的产品1
public class DatabaseLog implements Mylog{
public void print(){
System.out.println("database log ");
}
}
//具体的产品2
public class FileEditLog implements Mylog{
public void print(){
System.out.println("file edited... ");
}
}
工厂
//工厂接口
interface LogFactory{
Mylog crateLog();
}
public class DatabaseLogFactory implements LogFactory{
public Mylog crateLog(){
return new DatabaseLog();
}
}
public class FileEditLogFactory implements LogFactory{
public Log crateLog(){
return new FileEditLog();
}
}
测试
public class Main{
public static void main(String[] args) {
Mylog log = new DatabaseLogFactory().crateLog();
log.print();
}
}
3.抽象工厂模式
抽象工厂模式有了产品族的概念,
- 什么叫产品族呢?
在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。- 当系统所提供的工厂所需生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式。
- 抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态。
- 抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建 。当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、有效率。
UML图
image.png
源码
- 工厂定义
public interface AbstractFactory {
void createProductA();
void crateProductB();
}
//ContreteFactory1 生产的就是1级的机器人,他fight和run都很厉害
public class ContreteFactory1 implements AbstractFactory {
@Override
public void createProductA() {
new ProductA1().fight();
System.out.println();
}
@Override
public void crateProductB() {
new ProductB1().run();
}
}
- ContreteFactory2 工厂生产的是2级的机器人,他fight和run稍差
public class ContreteFactory2 implements AbstractFactory {
@Override
public void createProductA() {
new ProductA2().fight();
System.out.println();
}
@Override
public void crateProductB() {
new ProductB2().run();
}
}
- 产品族定义
public interface AbstractPruductA {
void fight();
}
public class ProductA1 implements AbstractPruductA {
@Override
public void fight() {
System.out.println("productA1 fight");
}
}
public class ProductA2 implements AbstractPruductA {
@Override
public void fight() {
System.out.println("product A2 fight");
}
}
public interface AbstractProductB {
void run();
}
public class ProductB1 implements AbstractProductB {
@Override
public void run() {
System.out.println("product B1 run");
}
}
public class ProductB2 implements AbstractProductB {
@Override
public void run() {
System.out.println("product B2 run");
}
}