工厂模式:工厂模式是创建对象的核心设计原则之一,允许客户端以某种方式创建库的对象,使其不与库的类层次结构紧密耦合。
工厂模式的几种形态:
- 简单工厂,一个单一的工厂类根据客户端传入的参数不同然后选择实现不同的具体对象。
- 工厂方法,也可以指作为“工厂”的方法,这个方法的主要目的就是创建对象,而这个方法不一定在单独的工厂类中。这些方法通常作为静态方法,定义在方法所实例化的类中。
- 抽象工厂,抽象工厂模式的实质是“提供接口,创建一系列相关或独立的对象,而不指定这些对象的具体类。
可能看了上面的定义可能还不太理解,没关系我们通过具体事例进行实践演练
需求:(假设最原始的现在没有具体的4s店)我想买辆车奔驰、奥迪、宝马其中的一辆都可以,但是我又不想直接去奔驰或者宝马生产地方去买,然后就开始纠结犹豫,突然有一天开了一家4s店说他们店里可以帮忙购买宝马、奔驰、或者奥迪的代理商
1、首先定义一个生产车辆共同规范接口(比如:环保指数不能超标之类的)
package com.weather.spring.cloud.initializrstart.design.mode.factory.simplef;
/**
* @program: msa-weather-master
* @description: This is car service for create car obejct
* @author: W.HL
* @create: 2019-04-01 14:10
**/
public interface CarService
{
/**
* create car object
*/
void createCar();
}
2、创建一个可以生产奔驰车地方
package com.weather.spring.cloud.initializrstart.design.mode.factory.simplef;
/**
* @program: msa-weather-master
* @description: This is BC car service for create
* @author: W.HL
* @create: 2019-04-01 14:13
**/
public class BCCarServiceImpl implements CarService
{
/**
* create car object
*/
@Override
public void createCar()
{
System.out.println("There is creating BC car");
}
}
3、创建一个可以生产宝马车地方
package com.weather.spring.cloud.initializrstart.design.mode.factory.simplef;
/**
* @program: msa-weather-master
* @description: This is BM car service for create
* @author: W.HL
* @create: 2019-04-01 14:13
**/
public class BMCarServiceImpl implements CarService
{
/**
* create car object
*/
@Override
public void createCar()
{
System.out.println("There is creating BM car");
}
}
4、创建一个可以生产奥迪车地方
package com.weather.spring.cloud.initializrstart.design.mode.factory.simplef;
/**
* @program: msa-weather-master
* @description: This is AD car service for create
* @author: W.HL
* @create: 2019-04-01 14:13
**/
public class ADCarServiceImpl implements CarService
{
/**
* create car object
*/
@Override
public void createCar()
{
System.out.println("There is creating AD car");
}
}
5、开启一个总工厂然后负责传递制造相应车辆信息,然后进行测试
package com.weather.spring.cloud.initializrstart.design.mode.factory.simplef;
import lombok.SneakyThrows;
/**
* @program: msa-weather-master
* @description: This is factory for creating car
* @author: W.HL
* @create: 2019-04-01 14:17
**/
public class SimpleDesignFactory
{
@SneakyThrows(Exception.class)
public static void createCar(String carName){
switch (carName){
case "BM" : new BMCarServiceImpl().createCar(); break;
case "BC" : new BCCarServiceImpl().createCar(); break;
case "AD" : new ADCarServiceImpl().createCar(); break;
default: throw new Exception("没有该类型车型");
}
}
public static void main(String[] args)
{
SimpleDesignFactory.createCar("AD");
}
@SneakyThrows(Exception.class)
public static CarService create(Class c){
/*利用反射机制获取对象 直接进行返回*/
CarService car = (CarService) Class.forName(c.getName()).newInstance();
/*缺点需要一个完整的类名 并且不能含有重复的类名 即完整类名的绝对路径*/
return car;
}
}
根据客户提供想要的车辆名称即可实现制造相应车辆,但是出现了一个问题如果我想要增加吉利车呢?就需要修改工厂类,如果工厂类一旦出现问题这个系统就会受到影响甚至瘫痪,所以就进行了后期优化采用反射机制的方式进行处理但是也有缺点就是“需要一个完整的类名 并且不能含有重复的类名 即完整类名的绝对路径”,如果有相同名称的对象就会出现问题。
随着业务的扩大就开始进军国际,然后就引入了工厂方法模式进行改善(分为美国工厂、中国工厂)
工厂方法模式
定义总产品接口标准
package com.weather.spring.cloud.initializrstart.design.mode.factory.methodf;
/**
* @program: msa-weather-master
* @description: Thi is car product service
* @author: W.HL
* @create: 2019-04-01 15:26
**/
public interface Product
{
/**
* create car service
*/
void createCar();
}
定义生产宝马
package com.weather.spring.cloud.initializrstart.design.mode.factory.methodf;
/**
* @program: msa-weather-master
* @description: This is a product for creating BM car
* @author: W.HL
* @create: 2019-04-01 15:30
**/
public class BMCarServiceImpl implements Product
{
/**
* create car service
*/
@Override
public void createCar()
{
System.out.println("There is creating BM car");
}
public BMCarServiceImpl()
{
System.out.println("There is creating BM car");
}
}
定义生产奔驰
package com.weather.spring.cloud.initializrstart.design.mode.factory.methodf;
/**
* @program: msa-weather-master
* @description: This is a product for creating BM car
* @author: W.HL
* @create: 2019-04-01 15:30
**/
public class BCCarServiceImpl implements Product
{
/**
* create car service
*/
@Override
public void createCar()
{
System.out.println("There is creating BC car");
}
public BCCarServiceImpl()
{
System.out.println("There is creating BC car");
}
}
定义生产奥迪
package com.weather.spring.cloud.initializrstart.design.mode.factory.methodf;
/**
* @program: msa-weather-master
* @description: This is a product for creating BM car
* @author: W.HL
* @create: 2019-04-01 15:30
**/
public class ADCarServiceImpl implements Product
{
/**
* create car service
*/
@Override
public void createCar()
{
System.out.println("There is creating AD car");
}
public ADCarServiceImpl()
{
System.out.println("There is creating AD car");
}
}
定义总工厂标准
package com.weather.spring.cloud.initializrstart.design.mode.factory.methodf;
/**
* @program: msa-weather-master
* @description: This is a factory service
* @author: W.HL
* @create: 2019-04-01 15:25
**/
public interface Factory
{
Product[] getProduct();
}
定义中国工厂
package com.weather.spring.cloud.initializrstart.design.mode.factory.methodf;
/**
* @program: msa-weather-master
* @description: This is a factory for creating car in chinese
* @author: W.HL
* @create: 2019-04-01 15:28
**/
public class ChineseFactory implements Factory
{
public ChineseFactory()
{
System.out.println("*********************China Factory********************");
}
@Override
public Product[] getProduct()
{
return new Product[]{new ADCarServiceImpl()};
}
}
定义美国工厂
package com.weather.spring.cloud.initializrstart.design.mode.factory.methodf;
/**
* @program: msa-weather-master
* @description: This is a factory for creating car in chinese
* @author: W.HL
* @create: 2019-04-01 15:28
**/
public class UsaFactory implements Factory
{
public UsaFactory()
{
System.out.println("*********************USA Factory********************");
}
@Override
public Product[] getProduct()
{
return new Product[]{new BMCarServiceImpl(),new BCCarServiceImpl()};
}
}
进行测试类编写
package com.weather.spring.cloud.initializrstart.design.mode.factory.methodf;
/**
* @program: msa-weather-master
* @description: This is test for Factory method mode
* @author: W.HL
* @create: 2019-04-01 15:38
**/
public class FactoryTest
{
public static void main(String[] args)
{
Factory chineseFactory = new ChineseFactory();
chineseFactory.getProduct();
Factory userFactory = new UsaFactory();
userFactory.getProduct();
}
}
中国工厂只负责生产奥迪,美国工厂只负责生产宝马和奔驰
抽象工厂模式
适用环境
(1)一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节。这对于所有形态的工厂模式都是重要的;
(2)一个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品;
(3)同属于同一个产品族的产品是在一起使用的,这一约束必须要在系统的设计中体现出来;
(4)系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。
定义相应的车标准以及相应制造车的地方
package com.weather.spring.cloud.initializrstart.design.mode.factory.abstractf;
/**
* @program: msa-weather-master
* @description: This is Car service for ceating car
* @author: W.HL
* @create: 2019-04-01 17:45
**/
public interface CarService
{
}
package com.weather.spring.cloud.initializrstart.design.mode.factory.abstractf;
/**
* @program: msa-weather-master
* @description: This is BMW car creating factory
* @author: W.HL
* @create: 2019-04-01 17:49
**/
public class AdiCarImpl implements CarService
{
public AdiCarImpl()
{
System.out.println("There is creating AD car");
}
}
package com.weather.spring.cloud.initializrstart.design.mode.factory.abstractf;
/**
* @program: msa-weather-master
* @description: This is BMW car creating factory
* @author: W.HL
* @create: 2019-04-01 17:49
**/
public class BMWCarImpl implements CarService
{
public BMWCarImpl()
{
System.out.println("There is creating BMW car");
}
}
定义总电视接口以及制造电视的地方
package com.weather.spring.cloud.initializrstart.design.mode.factory.abstractf;
/**
* @program: msa-weather-master
* @description: This is Car service for ceating car
* @author: W.HL
* @create: 2019-04-01 17:45
**/
public interface TvService
{
}
package com.weather.spring.cloud.initializrstart.design.mode.factory.abstractf;
/**
* @program: msa-weather-master
* @description: Thi is leTv service for tv
* @author: W.HL
* @create: 2019-04-01 17:47
**/
public class GeLiTvImpl implements TvService
{
public GeLiTvImpl()
{
System.out.println("There is creating GeLiTV");
}
}
package com.weather.spring.cloud.initializrstart.design.mode.factory.abstractf;
/**
* @program: msa-weather-master
* @description: Thi is leTv service for tv
* @author: W.HL
* @create: 2019-04-01 17:47
**/
public class LeTvImpl implements TvService
{
public LeTvImpl()
{
System.out.println("There is creating leTV");
}
}
package com.weather.spring.cloud.initializrstart.design.mode.factory.abstractf;
/**
* @program: msa-weather-master
* @description: Thi is leTv service for tv
* @author: W.HL
* @create: 2019-04-01 17:47
**/
public class MiTvImpl implements TvService
{
public MiTvImpl()
{
System.out.println("There is creating MiTV");
}
}
定义总工厂标准
package com.weather.spring.cloud.initializrstart.design.mode.factory.abstractf;
/**
* @program: msa-weather-master
* @description: This is factory for all product
* @author: W.HL
* @create: 2019-04-01 17:46
**/
public interface Factory
{
/**
* create car
* @return
*/
CarService[] getCar();
/**
* create Tv
* @return
*/
TvService[] getTv();
}
定义中国工厂(车:宝马;电视:小米、乐视、格力)
package com.weather.spring.cloud.initializrstart.design.mode.factory.abstractf;
/**
* @program: msa-weather-master
* @description: This is car factory
* @author: W.HL
* @create: 2019-04-01 17:52
**/
public class ChineseFactory implements Factory
{
/**
* create car
*
* @return
*/
@Override
public CarService[] getCar()
{
return new CarService[]{new BMWCarImpl()};
}
/**
* create Tv
*
* @return
*/
@Override
public TvService[] getTv()
{
return new TvService[]{new MiTvImpl(),new LeTvImpl(),new GeLiTvImpl()};
}
public ChineseFactory()
{
System.out.println("***************CHINA*****************");
}
}
定义美国工厂(车:奥迪;电视:格力)
package com.weather.spring.cloud.initializrstart.design.mode.factory.abstractf;
/**
* @program: msa-weather-master
* @description: This is car factory
* @author: W.HL
* @create: 2019-04-01 17:52
**/
public class UsaFactory implements Factory
{
/**
* create car
*
* @return
*/
@Override
public CarService[] getCar()
{
return new CarService[]{new AdiCarImpl()};
}
/**
* create Tv
*
* @return
*/
@Override
public TvService[] getTv()
{
return new TvService[]{new GeLiTvImpl()};
}
public UsaFactory()
{
System.out.println("***************USA*****************");
}
}
总代理工厂 进行测试
package com.weather.spring.cloud.initializrstart.design.mode.factory.abstractf;
import lombok.SneakyThrows;
/**
* @program: msa-weather-master
* @description: This is a factory service for creating car or tv
* @author: W.HL
* @create: 2019-04-02 09:49
**/
public class FactoryProductService
{
@SneakyThrows(Exception.class)
public static Factory getFactory(String cityName){
switch (cityName){
case "USA": return new UsaFactory();
case "CHINA" : return new ChineseFactory();
default: new Exception("not find this factory");
}
return null;
}
public static void main(String[] args)
{
FactoryProductService.getFactory("CHINA").getTv();
FactoryProductService.getFactory("CHINA").getCar();
FactoryProductService.getFactory("USA").getTv();
FactoryProductService.getFactory("USA").getCar();
}
}