:arrow: 第一个设计模式:简单工厂
UML示意图:
组成部分
1. 工厂类:产生产品的加工厂
2. 抽象产品:是具体产品的抽象,可以是interface和abstract
3. 具体产品:一个个实实在在的产品
说明:用户多工厂类产生并返回一个产品供用户使用
代码例子:
1. 工厂类
/*
* Created on 2006-11-25
*/
package simplefactory;
/**
* @author Administrator
*/
public class Factory {
public static IProduct getInstance(int i) throws Exception{
IProduct product = null;
switch(i){
case 1:product = new Product1();break;
case 2:product = new Product2();break;
default:throw new Exception("无此对象!");
}
return product;
}
}
2. 抽象产品接口
/*
* Created on 2006-11-25
*/
package simplefactory;
/**
* @author Administrator
*/
public interface IProduct {
//抽象产品
boolean login();
}
3. 具体产品1
/*
* Created on 2006-11-25
*/
package simplefactory;
/**
* @author Administrator
*/
public class Product1 implements IProduct {
/* (non-Javadoc)
* @see simplefactory.IProduct#login()
*/
public boolean login() {
//code is here
System.out.println("产品1的商业方法,login...");
return true;
}
}
具体产品2
/*
* Created on 2006-11-25
*/
package simplefactory;
/**
* @author Administrator
*/
public class Product2 implements IProduct{
/* (non-Javadoc)
* @see simplefactory.IProduct#login()
*/
public boolean login() {
// TODO Auto-generated method stub
System.out.println("产品2的商业方法,login...");
return false;
}
}
4. 使用
/*
* Created on 2006-11-25
*/
package simplefactory;
/**
* @author Administrator
*/
public class Main {
public static void main(String[] args) {
try {
IProduct product = Factory.getInstance(1);
product.login();//产品1
product = Factory.getInstance(2);
product.login();//产品2
product = Factory.getInstance(3);//没有这个产品,所以得到异常
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
5. 输出结果
产品1的商业方法,login...
产品2的商业方法,login...
java.lang.Exception: 无此对象!
at simplefactory.Factory.getInstance(Factory.java:17)
at simplefactory.Main.main(Main.java:19)
优点:客户端可以动态的创建并得到一个对象,使责任得到了分工。
缺点:工厂类是简单工厂模式的核心,创建并返回静态已知的对象。这样对于扩展性来说是一个阻碍。比如有新的产品加入,则只有在工厂类中加入代码。这违背了开-闭原则。
UML示意图:
组成部分
1. 工厂类:产生产品的加工厂
2. 抽象产品:是具体产品的抽象,可以是interface和abstract
3. 具体产品:一个个实实在在的产品
说明:用户多工厂类产生并返回一个产品供用户使用
代码例子:
1. 工厂类
/*
* Created on 2006-11-25
*/
package simplefactory;
/**
* @author Administrator
*/
public class Factory {
public static IProduct getInstance(int i) throws Exception{
IProduct product = null;
switch(i){
case 1:product = new Product1();break;
case 2:product = new Product2();break;
default:throw new Exception("无此对象!");
}
return product;
}
}
2. 抽象产品接口
/*
* Created on 2006-11-25
*/
package simplefactory;
/**
* @author Administrator
*/
public interface IProduct {
//抽象产品
boolean login();
}
3. 具体产品1
/*
* Created on 2006-11-25
*/
package simplefactory;
/**
* @author Administrator
*/
public class Product1 implements IProduct {
/* (non-Javadoc)
* @see simplefactory.IProduct#login()
*/
public boolean login() {
//code is here
System.out.println("产品1的商业方法,login...");
return true;
}
}
具体产品2
/*
* Created on 2006-11-25
*/
package simplefactory;
/**
* @author Administrator
*/
public class Product2 implements IProduct{
/* (non-Javadoc)
* @see simplefactory.IProduct#login()
*/
public boolean login() {
// TODO Auto-generated method stub
System.out.println("产品2的商业方法,login...");
return false;
}
}
4. 使用
/*
* Created on 2006-11-25
*/
package simplefactory;
/**
* @author Administrator
*/
public class Main {
public static void main(String[] args) {
try {
IProduct product = Factory.getInstance(1);
product.login();//产品1
product = Factory.getInstance(2);
product.login();//产品2
product = Factory.getInstance(3);//没有这个产品,所以得到异常
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
5. 输出结果
产品1的商业方法,login...
产品2的商业方法,login...
java.lang.Exception: 无此对象!
at simplefactory.Factory.getInstance(Factory.java:17)
at simplefactory.Main.main(Main.java:19)
优点:客户端可以动态的创建并得到一个对象,使责任得到了分工。
缺点:工厂类是简单工厂模式的核心,创建并返回静态已知的对象。这样对于扩展性来说是一个阻碍。比如有新的产品加入,则只有在工厂类中加入代码。这违背了开-闭原则。