国庆期间去东北参加了朋友的婚礼,时光飞逝呀,人生漫长又短暂,要给自己找点有乐趣的事情去做。
以下实践来自实验楼,链接:https://www.shiyanlou.com/courses/100/learning/?id=865,
什么是工厂模式?
工厂一般指生产特定产品的平台,那么类似的,工厂模式可以将其类比为一个工厂,指生产特定类型的对象的一种模式。工厂模式封装了创建对象的细节,使用者只使用对象就可以。
工厂模式分类:
普通工厂模式、多个工厂模式、静态工厂方法模式
普通工厂模式示例:
实现代码:
// 二者共同的接口
interface Human{
public void eat();
public void sleep();
public void beat();
}
// 创建实现类 Male
class Male implements Human{
public void eat(){
System.out.println("Male can eat.");
}
public void sleep(){
System.out.println("Male can sleep.");
}
public void beat(){
System.out.println("Male can beat.");
}
}
//创建实现类 Female
class Female implements Human{
public void eat(){
System.out.println("Female can eat.");
}
public void sleep(){
System.out.println("Female can sleep.");
}
public void beat(){
System.out.println("Female can beat.");
}
}
// 创建普通工厂类
class HumanFactory{
public Human createHuman(String gender){
if( gender.equals("male") ){
return new Male();
}else if( gender.equals("female")){
return new Female();
}else {
System.out.println("请输入正确的类型!");
return null;
}
}
}
// 工厂测试类
public class FactoryTest {
public static void main(String[] args){
HumanFactory factory = new HumanFactory();
Human male = factory.createHuman("male");
male.eat();
male.sleep();
male.beat();
}
}
编译后运行即可。
多个工厂模式示例:
// 多个工厂方法
public class HumanFactory{
public Male createMale() {
return new Male();
}
public Female createFemale() {
return new Female();
}
}
// 工厂测试类
public class FactoryTest {
public static void main(String[] args){
HumanFactory factory = new HumanFactory();
Human male = factory.createMale();
male.eat();
male.sleep();
male.beat();
}
}
静态工厂方法模式示例:
// 多个工厂方法
public class HumanFactory{
public static Male createMale() {
return new Male();
}
public static Female createFemale() {
return new Female();
}
}
// 工厂测试类
public class FactoryTest {
public static void main(String[] args){
Human male = HumanFactory.createMale();
male.eat();
male.sleep();
male.beat();
}
}
如上,可以看到,工厂模式只有一个创建函数,多个工厂模式有多个创建函数,静态工厂模式将多个工厂模式的创建函数设置为静态。第一种在使用时需要记住传入的字符,第二种需要实例化对象,因此使用最多的是第三种方法。
应用举例:
java中应用举例:
java.util.Calendar - getInstance()
java.util.Calendar - getInstance(TimeZone zone)
java.util.Calendar - getInstance(Locale aLocale)
java.util.Calendar - getInstance(TimeZone zone, Locale aLocale)
java.text.NumberFormat - getInstance()
java.text.NumberFormat - getInstance(Locale inLocale)