成为一名程序员已经两年,期间断断续续接触过一些设计模式,但一直一知半解,没有系统的进行学习。趁着十一假期的时间,对设计模式模式进行全面的进行一些了解、总结。希望对自己日后的工作,和看到文章的同行们有一些帮助。其中一定会有很多理解上的错误,希望朋友们可以帮忙指出,相互促进学些。
首先说一下设计模式的几个原则,开闭原则、里氏替换原则、依赖倒转原则、最少知道原则(迪米特原则)、接口隔离原则和合成复用原则。这些原则在网上都有大量的介绍,我就不再重复了。
下面直接进入正题,工厂模式的介绍。
1、简单工厂模式(静态工厂模式)
简单工厂模式包含三个部分,工厂类、产品接口、产品的实现类
首先要定义一个产品接口(以汽车为例)。
interface Car{
public void carRun();
}
然后是产品的不同实现,个人觉得接口是java编程的核心思想。
class Bmw implements Car{
public void carRun() {
// TODO Auto-generated method stub
System.out.println("Bmw is so cool!");
}
}
class Benz implements Car{
public void carRun() {
// TODO Auto-generated method stub
System.out.println("Benz is nice!");
}
}
最后是定义一个产品工厂,用户想得到仅是产品,他并不关心产品是那个厂家,如何生产出来的。
class CarFactory{
public Car createCar(String arg){
Car car = null;
if("Benz".equals(arg)){
car = new Benz();
}else if("Bmw".equals(arg)){
car = new Bmw();
}
return car;
}
}
这就完成了一个简单的工厂模式,只要创建一个CarFactory实例,并传入想要的车子类型,就可以得到相应的车子。
2、静态工厂模式
再次之上还可以进一步工厂升级,将工厂建造为静态工厂,每次想要得到车子的时候不需要创建工厂的实例。
public class StaticFactory {
public static Bmw createBmw(){
return new Bmw();
}
public static Benz createBenz(){
return new Benz();
}
}
3、工厂模式
静态工厂每增加一种车型,就需要修改静态工厂类,这样不符合设计模式中的开闭原则。所以引出我们的正经的工厂模式。
工厂模式较简单工厂模式增加了工厂类接口。
创建一个工厂接口,每个车型工厂实现此接口,创建汽车。
interface Factory{
public Car createCar();
}
class BmwFactory implements Factory{
public Car createCar() {
// TODO Auto-generated method stub
return new Bmw();
}
}
class BenzFactory implements Factory{
public Car createCar() {
// TODO Auto-generated method stub
return new Benz();
}
}
如果新增车型是需要创建一个新车型的工厂就可以,完全不用修改之前的代码,拓展性就较之前好了好多。
4、抽象工厂模式
相对于工厂模式,抽象工厂模式是为创建一组或相互依赖的对象提供一个接口,无需实例化类。翻译成人话就是抽象工厂可以生产一族(多种产品),而工厂模式是具体工厂生产相应的具体一种产品。当产品族中只有一种产品,抽象工厂模式就会退化成工厂模式方法。
interface Factory{
public Car createCar();
public Engine createEngine();
}
interface Car{
public void run();
}
interface Engine{
public void makePower();
}
class BmwFactory implements Factory{
public Car createCar() {
// TODO Auto-generated method stub
return new Bmw();
}
public Engin createEngine() {
// TODO Auto-generated method stub
return new BmwEngine();
}
}
class BenzFactory implements Factory{
public Car createCar() {
// TODO Auto-generated method stub
return new Benz();
}
public Engine createEngine() {
// TODO Auto-generated method stub
return new BenzEngin();
}
}