工厂模式
工厂方法模式又叫虚拟构造函数模式或者多态性工厂模式。工厂方法的用意是定义一个创建产品对象的工厂接口,将实际创见性工作推迟到子类中去。工厂模式可以分为简单工厂、工厂方法和抽象工厂模式。
简单工厂模式
严格说简单工厂模式不在23种GoF设计模式之中,它是由工厂决定创建具体类的实例。一个工厂类处于对产品类实例化的中心位置,它知道每一个产品,决定哪一个产品类应当被实例化。
优点:允许客户端(具体产品类)相对独立于产品实例的创建过程,当引入新的产品的时候,不需要修改现有的产品类。
缺点:由于对象的创建完全由工厂类控制,引入新的产品的时候就必须修改工厂类的相应的逻辑。
简单工厂模式的UML图如下:
逻辑涉及到的对象有以下3种:
工厂角色(Cerator):简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。
抽象产品角色(IProduct):简单工厂模式所创建的所有对象的父类,所有实例所共有的公共接口。
具体产品角色(ConcreteProduct):简单工厂模式的创建的实际目标。
下面是一个应用了简单工厂模式的,生产手机和电脑的电子工厂例子。
抽象产品接口:
public interface Iproduct {
public void doSomething() ;
}
具体产品角色:手机phone
public class Phone implements Iproduct{
@Override
public void doSomething() {
System.out.println("手机:打电话");
}
}
具体产品角色:电脑computer
public class Computer implements Iproduct{
@Override
public void doSomething() {
System.out.println("电脑:上网");
}
}
工厂角色:Creator
public class Creator {
public static Iproduct getProduct(String productName) throws Exception{
Iproduct product = null;
if(productName.equals("computer")) product = new Computer();
else if(productName.equals("phone")) product = new Phone();
else {
throw new Exception("工厂无法生产该产品!");
}
return product;
}
}
测试类:
public class Test {
public static void main(String[] args) throws Exception{
//获取手机phone的实例
Phone phone = (Phone)Creator.getProduct("phone");
phone.doSomething();
//获取电脑的实例
Computer computer = (Computer)Creator.getProduct("computer");
computer.doSomething();
}
}