设计模式——之工厂模式 笔记(理解Spring的Bean工厂)

Spring 的两个特性  IOC   、AOP

关于交通工具:::

以老张开车去东北为例::

工厂是指  自己生产自己的产品,,不再new


下面是简单工厂模式::

package com.linux_lihuafeng.factory;

public class Test {

 
 public static void main(String[] args) {
  Car c = Car.getInstance();
  c.run();
  
 }
}


package com.linux_lihuafeng.factory;

public class Car {

 private Car(){}
 
 public static Car getInstance() {
  return new Car();
 }
 public void run() {
  System.out.println("冒着烟奔跑中car......");
 }
}



只给司机一辆车;;   即单例模式{从始至终只有一个车}

package com.linux_lihuafeng.factory;

public class Car {

 //从始至终只开一辆车,,{单例}
 private static Car car = new Car();

//{多例}

private static List<Car> cars = new ArrayList<Car>();
 
 public static Car getInstance() {
  
  return car;
 }
 public void run() {
  System.out.println("冒着烟奔跑中car......");
 }
}


2.任意定制交通工具的类型和生产过程

package com.linux_lihuafeng.factory;

public class CarFactory extends VehicleFactory{

// public Car createFactory() {
//  return new Car();
// }

 @Override
 public Movable create() {
  
  return new Car();
 }
}


package com.linux_lihuafeng.factory;

public class PlaneFactory extends VehicleFactory{

 @Override
 public Movable create() {
  
  return new Plane();
 }

}


package com.linux_lihuafeng.factory;

public abstract class VehicleFactory {

 abstract Movable create();
}


package com.linux_lihuafeng.factory;

public class Test {

 
 public static void main(String[] args) {
  
  
  
  Movable m = new Plane();
  
  m.run();
  
 }
}


上面是简单工厂的示例


下面是抽象工厂:

3.系列产品(车、武器、食物、、、、)


应该有一个工厂用于生产一系列产品

package com.linux_lihuafeng.abstractfactory;


//用于产生系列产品
public class DefaultFactory {

 public Car creatCar() {
  return new Car();
 }
 public AK47 createAK47() {
  return new AK47();
 }
 
 public Apple createApple() {
  return new Apple();
 }
 
}


package com.linux_lihuafeng.abstractfactory;

public class Apple {

 public void getName() {
  System.out.println("Apple...");
 }
}


package com.linux_lihuafeng.abstractfactory;

import java.util.ArrayList;
import java.util.List;

public class Car {

 public void run() {
  System.out.println("冒着烟奔跑中car......");
 }
}


package com.linux_lihuafeng.abstractfactory;

public class AK47 {

 public void shoot() {
  System.out.println("哒哒哒");
 }
}



package com.linux_lihuafeng.abstractfactory;

public class Test {

 
 public static void main(String[] args) {
  
  //当一个人手里控制的产品很多时,,,需要一个工厂生产出一系列产品
//  Car c = new Car();
//  c.run();
//  AK47 ak = new AK47();
//  ak.shoot();
//  Apple ap = new Apple();
//  ap.getName();
  
  DefaultFactory df = new DefaultFactory();
  Car c = df.creatCar();
  c.run();
  AK47 ak = df.createAK47();
  ak.shoot();
  Apple ap = df.createApple();
  ap.getName();
 }
}


进一步进行抽象:::

画一个类图 如下:

                                                                AbstractFactory


                                      MagicFactory                                   DefaultFactory

                 

                    

                                       v1    f1       w2                                   v2     f2    w2



                                              v1 v2               f1   f2                    w1      w2


                                              Vehicle            Food                     Weapon



代码如下::

package com.linux_lihuafeng.abstractfactory;

public abstract class AbstractFactory {

 public abstract Vehicle createVehicle();
 public abstract Weapon createWeapon();
 public abstract Food createFood();
}

===============================================

package com.linux_lihuafeng.abstractfactory;


//用于产生系列产品
public class DefaultFactory extends AbstractFactory{

// public Car creatCar() {
//  return new Car();
// }
// public AK47 createAK47() {
//  return new AK47();
// }
// 
// public Apple createApple() {
//  return new Apple();
// }
 @Override
 public Food createFood() {
  // TODO Auto-generated method stub
  return new Apple();
 }
 @Override
 public Vehicle createVehicle() {
  // TODO Auto-generated method stub
  return new Car();
 }
 @Override
 public Weapon createWeapon() {
  // TODO Auto-generated method stub
  return new AK47();
 }
 
}




package com.linux_lihuafeng.abstractfactory;

public class MagicFactory extends AbstractFactory{

// public Broom createBroom() {
//  return new Broom();
// }
// 
// 
// public MagicStick createMagicStick() {
//  return new MagicStick();
// }
// 
// 
// public MushRoom createMushRoom() {
//  return new MushRoom();
// }


 @Override
 public Food createFood() {
  // TODO Auto-generated method stub
  return new MushRoom();
 }


 @Override
 public Vehicle createVehicle() {
  // TODO Auto-generated method stub
  return new Broom();
 }


 @Override
 public Weapon createWeapon() {
  // TODO Auto-generated method stub
  return new MagicStick();
 }
}





==========================================

package com.linux_lihuafeng.abstractfactory;

public abstract class Vehicle {

 public abstract void run() ;
}


package com.linux_lihuafeng.abstractfactory;

public abstract class Weapon {

 public abstract void shoot() ;
}


package com.linux_lihuafeng.abstractfactory;

public abstract class Food {

 public abstract void getName() ;
 
}
===========================================
package com.linux_lihuafeng.abstractfactory;

public class AK47 extends Weapon{

 public void shoot() {
  System.out.println("哒哒哒");
 }


}


package com.linux_lihuafeng.abstractfactory;

public class Apple extends Food{

 public void getName() {
  System.out.println("Apple...");
 }
}


package com.linux_lihuafeng.abstractfactory;

import java.util.ArrayList;
import java.util.List;

public class Car extends Vehicle{

 public void run() {
  System.out.println("冒着烟奔跑中car......");
 }
}

==================================================

package com.linux_lihuafeng.abstractfactory;

public class Broom extends Vehicle{

 public void run() {
  System.out.println("一路灰...");
 }
 
}


package com.linux_lihuafeng.abstractfactory;

public class MagicStick extends Weapon{

 @Override
 public void shoot() {
  // TODO Auto-generated method stub
  System.out.println("fire hu hu hu...");
 }

}


package com.linux_lihuafeng.abstractfactory;

public class MushRoom extends Food{

 @Override
 public void getName() {
  // TODO Auto-generated method stub
  System.out.println("mushroom");
 }

}
=====================================================


package com.linux_lihuafeng.abstractfactory;

public class Test {

 
 public static void main(String[] args) {
  
  //当一个人手里控制的产品很多时,,,需要一个工厂生产出一系列产品
//  Car c = new Car();
//  c.run();
//  AK47 ak = new AK47();
//  ak.shoot();
//  Apple ap = new Apple();
//  ap.getName();
  
//  DefaultFactory df = new DefaultFactory();
//  Car c = df.creatCar();
//  c.run();
//  AK47 ak = df.createAK47();
//  ak.shoot();
//  Apple ap = df.createApple();
//  ap.getName();
  
  AbstractFactory af = new MagicFactory();
  Food f = af.createFood();
  f.getName();
  Vehicle v = af.createVehicle();
  v.run();
  Weapon w = af.createWeapon();
  w.shoot();
 }
}


抽象工厂的一个实例::换皮肤的软件


当  生产了一系列产品,,当想对这系列产品进行扩展 想对生产过程进行控制  或者想要对这一系列产品进行更换时   可用该抽象工厂

简单工厂的短处::产生产品系列的时候会很麻烦,,工厂泛滥
抽象工厂的短处::产生新产品品种时,,需大改,



下面是Sring  的 Bean  工厂

建一个fie   名为spring.properties

VehicleType=com.linux_lihuafeng.spring.factory.Car

=====================================================
package co.linux_lihuafeng.spring.factory;
public interface BeanFactory {
 Object getBean(String id);
}


======================================================
package co.linux_lihuafeng.spring.factory;
import java.io.IOException;
import java.util.Properties;
public class Test {
 public static void main(String[] args) {
  Properties props = new Properties();
  try {
   props.load(Test.class.getClassLoader().
     getResourceAsStream("com/linux_lihuafeng/spring/factory/spring.properties"));
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  String vehicleTypeName = props.getProperty("VehicleType");
  System.out.println(vehicleTypeName);
  Object o;
  try {
   o = Class.forName(vehicleTypeName).newInstance();
   Movable m = (Movable)o;
   m.run();
  } catch (InstantiationException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (ClassNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
 }
}
========================================================

package co.linux_lihuafeng.spring.factory;
public class Train implements Movable{
 @Override
 public void run() {
  System.out.println("火车呜呜呜...");
 }
}


==========================================================

package co.linux_lihuafeng.spring.factory;
import java.util.ArrayList;
import java.util.List;
public class Car implements Movable{

 public void run() {
  System.out.println("冒着烟奔跑中car......");
 }
}

总结:
1.只给司机一辆车(单例、多例)
2.任意定制交通工具的类型和生产过程
3.系列产品(车、武器、思品补给。。。。。)
4.Bean 工厂
         1).基于接口的类型任意定制
         2).一定程度上的生产过程定制(AOP)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值