Factory Method (工厂模式)

什么是工厂设计模式

根据名字即可了解,工厂肯定是用来生产产品的,在我们的程序开发中,需要用到不同的类,对于熟悉SSH、SSM开发的可以知道,在初期学习的时候,总是有一个框架提供好的的factory供我们使用,利用它可以创建访问数据库的连接等操作。

定义:

利用template method设计模式创建我们想要的实例,就称之为factory method。

具体到面向对象

《framework》生成实例框架:可以理解为在我使用factoy method时这个是必须的,组成元素在这个包下

《product》: 具体的产品类,你需要生成什么就可以创建自己的产品。加工处理

UML 代码

Factory Method (工厂模式)

这个例子就是实现创建一个身份证,然后使用它

framework包下

Factory :创建实例的方法 这里要注意创建 注册都是维护的protected方法

Product : 定义操作的方法

product包下

IdCard :具体的产品

IdCardFactory :实现了具体的创建。

Factory
```
package base.factory.framework;

/**

@program: DesignPatterns

@description: 创建实例的类

@author: Mr.Dai

@create: 2018-05-07 15:48
**/
public abstract class Factory {

public final Product create(String name){
Product product = createProduct(name);
registerProduct(product);
return product;
}

protected abstract Product createProduct(String name);
protected abstract void registerProduct(Product product);
}
```

Product
```
package base.factory.framework;

/**

@program: DesignPatterns

@description: 定义具体方法的类

@author: Mr.Dai

@create: 2018-05-07 15:51
**/
public abstract class Product {

public abstract void use();

}

- IdCard

package base.factory.idcard;

import base.factory.framework.Product;

/**

@program: DesignPatterns

@description: 具体的身份类

@author: Mr.Dai

@create: 2018-05-07 15:57
**/
public class IdCard extends Product {

private String name;

IdCard(String name){
System.out.println("创建了"+name+"的身份证");
this.name=name;
}
@Override
public void use() {
System.out.println("使用了"+name+"的身份证");
}

public String getOwer(){
return this.name;
}
}
```

IdCardFactory
```
package base.factory.idcard;

import base.factory.framework.Factory;
import base.factory.framework.Product;

import java.util.Vector;

/**

@program: DesignPatterns

@description: 生产身份证具体的类

@author: Mr.Dai

@create: 2018-05-07 16:00
**/
public class IdCardFactory extends Factory {

private Vector idcards=new Vector();

@Override
public Product createProduct(String name) {
return new IdCard(name);
}

@Override
public void registerProduct(Product product) {
idcards.add(((IdCard)product).getOwer());
}

public Vector getIdCards(){
return idcards;
}
}
```

结果

具体说明

product:是生成实例具有的接口方法,具体处理由子类决定

CreatedProduct:具体的产品 由idcard承担

CreatedCreator:具体的创建者 由IdCardFactory承担

IdCardFactory是具体的承担者,父类Factory将会解除与子类的耦合,实际上是子类具体的创建者来生成具体的实例。

实际运用中,我们没有必要去修改framework下的任何内容,假设我们这里要维护一台电视机,只需要创建具体的类即可。

实例产生的三种方式

指定为抽象方法
```
public abstract class Factory {

public final Product create(String name){

- 直接生成

public abstract class Factory {

public Product create(String name){

return new Product(name);//这样的话,product就不能为抽象类

#### Televison 电视类 并且实现 保存编号 以及所有者之间的对应表 ![](https://images2018.cnblogs.com/blog/1160484/201805/1160484-20180507165529932-1718560431.png) - Televison

package base.factory.television;

import base.factory.framework.Product;

/**

@program: DesignPatterns

@description: 电视类

@author: Mr.Dai

@create: 2018-05-07 16:40
**/
public class Televison extends Product {

private String name;
Televison(String name){
this.name=name;
}

@Override
public void use() {
open();
runing();
close();
}

public void open(){
System.out.println("开电视"+name);
}
public void runing(){
System.out.println("看电视"+name);
}
public void close(){
System.out.println("关闭电视"+name);
}

public String getName(){
return this.name;
}
}
```

TelevisionFactory
```
package base.factory.television;

import base.factory.framework.Factory;
import base.factory.framework.Product;

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

/**

@program: DesignPatterns

@description: 创建televi

@author: Mr.Dai

@create: 2018-05-07 16:45
**/
public class TelevisionFactory extends Factory {

private TreeMap teleS=new TreeMap<>();
private int i=0;
@Override
protected Product createProduct(String name) {
return new Televison(name);
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zypdwg.html