案例:
这里有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{@Overridepublic void printPrice() {System.out.println("食品的价格");}@Overridepublic 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;}
}