设计模式(工厂模式)
一、工厂模式介绍
在工厂模式中,父类决定生成示例的方式,但不决定所要生成的具体的类,具体的处理部分交给子类负责。这样就可以将生成示例的框架和生成示例的类解耦。
二、示例程序
以下示例程序的作用是用来制作身份证(IdCard),它其中有5个类。
Product类和Factory类属于framework包,这两个类组成生成示例的框架。
Product类
framework包中的Product类是用来表示被工厂生成的“产品”的类。在该类中仅声明了use抽象方法,具体实现交给子类负责。
在这个框架中,定义了“产品”是“任意可以use”的东西。
package com.pengpan.designmode.factory.framework;
/**
* 产品抽象类
*/
public abstract class Product {
public abstract void use();
}
Factory类
在这个框架中,我们定义了用来“生成产品”的createProduct()的抽象方法和用于注册产品的registerProduct()抽象方法。"生成产品"和"注册产品"的具体处理交给子类负责。
在这个框架中,我们定义了工厂是用来“调用create方法生成Product实例”的。
package com.pengpan.designmode.factory.framework;
/**
* 工厂抽象类
*/
public abstract class Factory {
public final Product create(String userName) {
Product product = createProduct(userName);
registryProduct(product);
return product;
}
protected abstract Product createProduct(String userName);
protected abstract void registryProduct(Product product);
}
IDCard类
package com.pengpan.designmode.factory.idcard;
import com.pengpan.designmode.factory.framework.Product;
public class IdCard extends Product {
private final String userName;
public IdCard(String userName) {
this.userName = userName;
}
@Override
public void use() {
System.out.println("使用了" + userName + "的IdCard");
}
private String getUserName() {
return this.userName;
}
}
IDCardFactory类
IDCardFactory类实现了createProduct()方法和registerProduct()方法,用于生成IDCard和注册IDCard。
package com.pengpan.designmode.factory.idcard;
import com.pengpan.designmode.factory.framework.Factory;
import com.pengpan.designmode.factory.framework.Product;
import java.util.ArrayList;
import java.util.List;
public class IdCardFactory extends Factory {
List<Product> idCardList = new ArrayList<>();
@Override
public Product createProduct(String userName) {
return new IdCard(userName);
}
@Override
public void registryProduct(Product product) {
idCardList.add(product);
}
}
Main类
package com.pengpan.designmode.factory;
import com.pengpan.designmode.factory.framework.Factory;
import com.pengpan.designmode.factory.framework.Product;
import com.pengpan.designmode.factory.idcard.IdCardFactory;
public class Main {
public static void main(String[] args) {
Factory factory = new IdCardFactory();
Product cardZ = factory.create("张三");
Product cardL = factory.create("李四");
Product cardW = factory.create("王五");
cardZ.use();
cardL.use();
cardW.use();
}
}