设计模式之工厂模式

      成为一名程序员已经两年,期间断断续续接触过一些设计模式,但一直一知半解,没有系统的进行学习。趁着十一假期的时间,对设计模式模式进行全面的进行一些了解、总结。希望对自己日后的工作,和看到文章的同行们有一些帮助。其中一定会有很多理解上的错误,希望朋友们可以帮忙指出,相互促进学些。

      首先说一下设计模式的几个原则,开闭原则、里氏替换原则、依赖倒转原则、最少知道原则(迪米特原则)、接口隔离原则和合成复用原则。这些原则在网上都有大量的介绍,我就不再重复了。

 

下面直接进入正题,工厂模式的介绍。

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();
 }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值