初次写,不足之处,请各位道友指正批评!
工厂模式:顾名思义就是建立一个工厂,对一系列具有共有属性的不同物品的创建,也就是对实现了同一个接口的不同的实现类的创建。
这是关系图:
下面,用代码演示下:
1、先创建接口:
//接口
public interface Bike {
public void riding();
}
2、再创建两实现类
//ofo
public class OfoBike implements Bike {
@Override
public void riding() {
System.out.println("this is ofo bike riding");
}
}
//mobike
public class Mobike implements Bike {
@Override
public void riding() {
System.out.println("this is mobike bike riding ");
}
}
3、创建工厂类
/**
*
* Title: 工厂类,根据不同的类型来创建不同的实现类
*
* @author Administrator
* @date 2017年3月28日上午12:07:10
*/
public class BikeFactory {
public Bike produce(String type) {
if ("ofo".equals(type)) {
return new OfoBike();
} else if ("mobike".equals(type)) {
return new Mobike();
} else {
System.out.println("不是正确的类型");
return null;
}
}
}
4、测试
/**
* 工厂模式测试类
*
* @author Administrator
* @date 2017年3月27日下午11:09:06
*/
public class FactoryModeTest {
public static void main(String[] args) {
new BikeFactory().produce("ofo").riding();
}
}
输出结果:this is ofo bike riding
这种方式不好之处就是传入的类型如果发生错误,那么对应的类型就无法创建。我们可以做一些改进,工厂类增加方法,各类型用各自的方法,这样就不会有类型传错的发生。如下图所示
相应的代码调整
/**
*
* Title: 工厂类,根据不同的方法来创建不同的实现类
*
* @author Administrator
* @date 2017年3月28日上午12:07:10
*/
public class BikeFactory {
public Bike produceOfo() {
return new OfoBike();
}
public Bike produceMobike() {
return new Mobike();
}
}
/**
* 工厂模式测试类
*
* @author Administrator
* @date 2017年3月27日下午11:09:06
*/
public class FactoryModeTest {
public static void main(String[] args) {
new BikeFactory().produceOfo().riding();
}
}
输出结果:this is ofo bike riding
上面结果还要创建相应的工厂类才能创建实例,来实际工作中,这很少见,所以做相应改进,将创建方法改为静态方法,这样就不同创建工厂类实例了
public class BikeFactory {
public static Bike produceOfo() {
return new OfoBike();
}
public static Bike produceMobike() {
return new Mobike();
}
}
public class FactoryModeTest {
public static void main(String[] args) {
BikeFactory.produceOfo().riding();
}
}
输出结果:this is ofo bike riding
实际开发中也是这样用
工厂模式依靠工厂类来创建实例不同的实例,然而却不能创建所有的实例,比如apple是生产iphone,而华为是生产华为的手机,这就引入了一个抽象工厂的概念,要创建新的新的实例,直接再创建一个新的工厂类即可,这样也避免了原有工厂类的修改,这样原有的代码就可以这样修改
/**
* Title: 工厂类
*
* @author Administrator
* @date 2017年3月28日上午12:07:10
*/
public interface BikeFactory {
public Bike produce();
}
/**
* Title: OfoBikeFactory
*
* @author Administrator
* @date 2017年3月28日上午1:01:23
*/
public class OfoBikeFactory implements BikeFactory {
@Override
public Bike produce() {
return new OfoBike();
}
}
/**
* Title: MobikeFactory
*
* @author Administrator
* @date 2017年3月28日上午1:01:59
*/
public class MobikeFactory implements BikeFactory {
@Override
public Bike produce() {
return new Mobike();
}
}
/**
* 工厂模式测试类
*
* @author Administrator
* @date 2017年3月27日下午11:09:06
*/
public class FactoryModeTest {
public static void main(String[] args) {
new OfoBikeFactory().produce().riding();
}
}
输出结果:this is ofo bike riding
如果再来一个,只要创建相应的factory即可,无需改动现有的代码,符合六大设计原则(java 8 中好像可以定义接口的static 方法了)