创建对象有的时候是个复杂的事,想统一交给一个类去处理,不用每个调用的地方都自己创建。而且也想支持扩展,后面根据分类去新增创建对象,工厂方法正好合适。将创建对象推迟到子类去实现,这样就可以方便扩展,也将创建对象的工作交给同一个类去处理。
就用做汉堡举个例子吧,想吃汉堡,需要拿面包夹生菜,加肉饼,加番茄,加酱。有点麻烦,每个人都要自己做一遍,而且还要自己准备食材。我就想简单吃个汉堡填肚子,不想做,怎么办。现实中我们就去肯德基,直接买一个。肯德基就是一个汉堡制作工厂,提前采购食材,然后统一加工。
首先是产品是汉堡包
public abstract class Hamburger {
public void make(){
}
}
然后具体有2家一家是肯德基,一家是麦当劳
``
public class KfcHamburger extends Hamburger{
@Override
public void make() {
//烤面包坯
System.out.println(“kfc 烤面包坯”);
//加生菜
System.out.println(“kfc 加生菜”);
//加番茄
System.out.println(“kfc 加番茄”);
//烤肉饼
System.out.println(“kfc 烤肉饼”);
//面包夹其他
System.out.println(“kfc 面包夹其他”);
//装KFC盒子中
System.out.println(“kfc 装KFC盒子中”);
}
}
public class McHamburger extends Hamburger{
@Override
public void make() {
//烤面包坯
System.out.println("mc 烤面包坯");
//加生菜
System.out.println("mc 加生菜");
//加番茄
System.out.println("mc 加番茄");
//烤肉饼
System.out.println("mc 烤肉饼");
//面包夹其他
System.out.println("mc 面包夹其他");
//装麦当劳盒子中
System.out.println("mc 装麦当劳盒子中");
}
}
然后是工厂抽象类是一个类型索引的目录
public abstract class Index {
public abstract <T extends Hamburger> T findFood(Class<T> c);
}
实现之一就是大众点评,比如你想吃啥汉堡,可能回去看大众点评
public class DianpingSoftware extends Index {
@Override
public <T extends Hamburger> T findFood(Class<T> c) {
Hamburger food = null;
try{
food = (Hamburger)Class.forName(c.getName()).newInstance();
}catch (Exception e){
}
return (T)food;
}
}
你看好了,知道吃啥了, 看了大众点评,准备先吃肯德基,再吃麦当劳
public class CustomerA {
public static void main(String[] args){
Index customerA = new DianpingSoftware();
Hamburger kfcShop = customerA.findFood(KfcHamburger.class);
kfcShop.make();
Hamburger mcShop = customerA.findFood(McHamburger.class);
mcShop.make();
}
}
结果如下,这样你就方便直接吃汉堡了, 不用自己做了。
kfc 烤面包坯
kfc 加生菜
kfc 加番茄
kfc 烤肉饼
kfc 面包夹其他
kfc 装KFC盒子中
mc 烤面包坯
mc 加生菜
mc 加番茄
mc 烤肉饼
mc 面包夹其他
mc 装麦当劳盒子中
抽象模式
产品
public abstract class Product {
public void method1(){
}
public void method2(){
}
}
public class ConcreteProduct1 extends Product{
@Override
public void method2(){
}
}
public class ConcreteProduct2 extends Product{
public void method2(){
}
}
工厂
public abstract class Creator {
public abstract <T extends Product> T createProduct(Class<T> c);
}
public class ConcreteCreator extends Creator{
@Override
public <T extends Product> T createProduct(Class<T> c) {
Product product = null;
try{
product = (Product)Class.forName(c.getName()).newInstance();
}catch (Exception e){
}
return (T)product;
}
}
调用类
public class Client {
public static void main(String[] args){
Creator creator = new ConcreteCreator();
Product product = creator.createProduct(ConcreteProduct1.class);
}
}
总结
- 工厂模式是一种创建模式,用于创建对象。
- 使用继承方式扩展。