Java设计模式—-工厂模式

在工厂模式中,父类决定实例生成的具体方式,但是决定不了具体生成的类,具体的处理全部交给子类负责,类似于模板模式。

1.1 定义Product抽象类

Product类来表示产品,这个类中只声明了抽象方法use()等待子类重写。

1
2
3
4
5
6
7
8
/**
* @author ikun
* @date 2024年06月28日 14:35
*/
public abstract class Product {
public abstract void use();
}

1.2 定义Factory抽象类

Factory类使用了模板模式,本类定义了抽象方法 creatProductregisterProduct,定义并实现了 create 方法,通过调用这个方法实现产品的注册。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* @author ikun
* @date 2024年06月28日 14:50
*/
public abstract class Factory {

public Product create(String owner) {
Product p = createProduct(owner);
registerProduct(p);
return p;
}

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

1.3 定义IDCard类

继承了 Product 类并实现了 use() 方法,构造器初始化了属性 owneridNum,并输出语句进行提示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* @author ikun
* @date 2024年06月29日 09:17
*/
public class IDCard extends Product {
private String owner;
private int idNum;

IDCard(String owner, int idNum) {
System.out.println("制作" + owner + "(" + idNum + ")" + "的ID卡...");
this.owner = owner;
this.idNum = idNum;
}

@Override
public void use() {
System.out.println("使用" + owner + "(" + idNum + ")" + "的ID卡...");
}

public String getOwner() {
return owner;
}
}

1.4 定义IDCardFactory类

这个类继承了 Factory 并实现了其两个抽象方法,creatProduct 方法通过生成 IDCard 的实例来生成产品,registerProduct 通过将 IDCardowner 保存到 List 数组中实现注册产品。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* @author ikun
* @date 2024年06月29日 10:07
*/
@SuppressWarnings("all")
public class IDCardFactory extends Factory {

private List<String> owners = new ArrayList<>();
private int idNum = 1001;

@Override
protected Product createProduct(String owner) {
return new IDCard(owner, idNum++);
}

@Override
protected void registerProduct(Product product) {
owners.add(((IDCard) product).getOwner());
}
}

1.5 测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* @author ikun
* @date 2024年06月29日 10:24
*/
public class RunMain {
public static void main(String[] args) {
Factory factory = new IDCardFactory();
Product card1 = factory.create("小明");
Product card2 = factory.create("小红");
Product card3 = factory.create("小刚");
rd1.use();
card2.use();
card3.use();
}
}

1.6 运行结果

gc-1

1.7 总结

具体的实现内容根据工厂模式适用场景不同而变化,但是只要是工厂模式,在生成实例时就一定会用到模板模式。