案例:
这里有Factory类、Goods接口、Foods类、Drink类以及Others类。其中,Foods类、Drink类和Others类继承Goods接口,实现各自对应的方法。然后,在测试类中,创建Goods接口指向三个子类中的某一个,通过Factory类来判断指向哪个子类,并执行对应方法。
准备阶段:
Goods接口内容如下:
public interface Goods {
//定义商品价格
void printPrice();
//定义商品产地
void printAddress();
}
Foods类内如下:
public class Foods implements Goods{
@Override
public void printPrice() {
System.out.println("食品的价格");
}
@Override
public void printAddress() {
System.out.println("食品的产地");
}
}
其他两个子类与Foods类内容相似,详细内容略。
一、工厂模式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,创建对象时使用一个共同的接口(本案例为Goods)来指向新创建的对象(本案例为Foods、Drink和Others)。工厂模式提供了一种创建对象的最佳方式。
1.Factory类的创建
在Facrory类中,定义一个方法,来返回判断出对象的类型。
public class Factory {
public Factory(){}
//通过字符串来判断对象属于哪一个类,并返回一个Goods的对象
public Goods GetGood(String str){
Goods goods = null;
if (str.equals("food")){
goods=new Foods();
}else if (str.equals("drink")){
goods = new Drink();
}else {
goods = new Others();
}
return goods;
}
}
2.在测试类中的运行
测试代码:
public class FactoryModeI {
public static void main(String[] args) {
Factory factory= new Factory();
Goods good1 = factory.GetGood("food");
good1.printPrice();
good1.printAddress();
Factory factory2= new Factory();
Goods good2 = factory2.GetGood("drink");
good2.printPrice();
good2.printAddress();
}
}
运行结果:
在这个模式中,我们可以任意创建一个Factory类的对象来操作,然而很多时候我们不需要创建很多的Factory类的对象。
二、单例模式
单例模式中,我们不用创建过多的Factory类的对象,直接利用实现创建好的Factory类的对象即可。在单例模式中,又分为懒汉模式和饿汉模式。
1.懒汉模式
懒汉模式,当需要创建factory时,再创建factory对象。因此要判断factory对象是否为空。
public class Factory {
//懒汉模式
//先定义一个Factory类的属性,用于判断工厂是否需要创建
private static Factory factory=null;
//然后私有化Factory类的构造方法
private Factory(){}
//判断factory对象是否为空,为空创建新的对象
public static Factory Instance(){
if (factory==null) {
factory = new Factory();
return factory;
}
public Goods GetGood(String str){
Goods goods = null;
if (str.equals("food")){
goods=new Foods();
}else if (str.equals("drink")){
goods = new Drink();
}else {
goods = new Others();
}
return goods;
}
}
2.饿汉模式
和懒汉模式不同,饿汉模式事先就创建好了一个Factory类的对象待命,随时准备被调用。
public class Factory {
//饿汉模式,开始就创建好对象了
private static Factory factory=new Factory();
private Factory(){}
public Goods GetGood(String str){
Goods goods = null;
if (str.equals("food")){
goods=new Foods();
}else if (str.equals("drink")){
goods = new Drink();
}else {
goods = new Others();
}
return goods;
}
}