设计模式之工厂方法-java版

创建对象有的时候是个复杂的事,想统一交给一个类去处理,不用每个调用的地方都自己创建。而且也想支持扩展,后面根据分类去新增创建对象,工厂方法正好合适。将创建对象推迟到子类去实现,这样就可以方便扩展,也将创建对象的工作交给同一个类去处理。

就用做汉堡举个例子吧,想吃汉堡,需要拿面包夹生菜,加肉饼,加番茄,加酱。有点麻烦,每个人都要自己做一遍,而且还要自己准备食材。我就想简单吃个汉堡填肚子,不想做,怎么办。现实中我们就去肯德基,直接买一个。肯德基就是一个汉堡制作工厂,提前采购食材,然后统一加工。

首先是产品是汉堡包

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);  
    }  
}

总结

  1. 工厂模式是一种创建模式,用于创建对象。
  2. 使用继承方式扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值