设计模式(工厂模式)
一、工厂模式介绍
在工厂模式中,父类决定生成示例的方式,但不决定所要生成的具体的类,具体的处理部分交给子类负责。这样就可以将生成示例的框架和生成示例的类解耦。
二、示例程序
以下示例程序的作用是用来制作身份证(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;}@Overridepublic 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<>();@Overridepublic Product createProduct(String userName) {return new IdCard(userName);}@Overridepublic 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();}
}