简单工厂模式
一个工厂
,当添加一个产品的时候,需要破坏工厂的方法
违反开闭原则。
//car
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/6/27 0027 16:16
*/
public interface Car {
void name();
}
//Tesla
package BFactory.simple;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/6/27 0027 16:17
*/
public class Tesla implements Car {
@Override
public void name() {
System.out.println("特斯拉");
}
}
//Wuling
package BFactory.simple;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/6/27 0027 16:17
*/
public class WuLing implements Car {
@Override
public void name() {
System.out.println("五菱宏光");
}
}
//CarFactory
package BFactory.simple;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/6/27 0027 16:19
* 开闭原则
* 简单工厂模式,静态工厂模式
* 增加一个新的产品,需要修改代码
*/
public class CarFactory {
//方法1
//违反开闭原则:当需要添加车辆时需要加上if else进行判断
public static Car getCar(String car){
if(car.equals("五菱")){
return new WuLing();
}else if(car.equals("特斯拉")){
return new Tesla();
}
return null;
}
}
工厂方法模式
不同的产品
对应不同的产品工厂
。
car和上面的基本一致
//CarFactory
public interface CarFactory {
Car getCar();
}
//TeslaFactory
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/6/27 0027 16:26
*/
public class TeslaFactory implements CarFactory {
@Override
public Car getCar() {
return new Tesla();
}
}
//WulingFactory
public class WulingFactory implements CarFactory {
@Override
public Car getCar() {
return new WuLing();
}
}
抽象工厂模式
//手机及其对应实现
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/6/27 0027 16:42
* 手机产品接口
*/
public interface IphoneProduct {
void start();
void shutdown();
void callup();
void sendSMS();
}
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/6/27 0027 16:44
小米手机
*/
public class XiaoMiPhone implements IphoneProduct {
@Override
public void start() {
System.out.println("开启小米手机");
}
@Override
public void shutdown() {
System.out.println("关闭小米手机");
}
@Override
public void callup() {
System.out.println("小米打电话");
}
@Override
public void sendSMS() {
System.out.println("小米发短信新");
}
}
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/6/27 0027 16:45
*/
public class HuaweiPhone implements IphoneProduct {
@Override
public void start() {
System.out.println("华为开机");
}
@Override
public void shutdown() {
System.out.println("华为关闭");
}
@Override
public void callup() {
System.out.println("华为打电话");
}
@Override
public void sendSMS() {
System.out.println("会为发短信");
}
}
//路由器及其实现
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/6/27 0027 16:43
路由器产品接口
*/
public interface IRouterProduct {
void start();
void shutdown();
void openwifi();
void setting();
}
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/6/27 0027 16:48
*/
public class HuaweiRouter implements IRouterProduct {
@Override
public void start() {
System.out.println("启动huawei路由器");
}
@Override
public void shutdown() {
System.out.println("关闭huawie路由器");
}
@Override
public void openwifi() {
System.out.println("huawei设置wifi");
}
@Override
public void setting() {
System.out.println("huawei设置");
}
}
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/6/27 0027 16:46
*/
public class XiaomiRouter implements IRouterProduct {
@Override
public void start() {
System.out.println("启动小米路由器");
}
@Override
public void shutdown() {
System.out.println("关闭小米路由器");
}
@Override
public void openwifi() {
System.out.println("小米设置wifi");
}
@Override
public void setting() {
System.out.println("小米设置");
}
}
//抽象工厂
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/6/27 0027 16:51
* 抽象产品工厂
*/
public interface IproductFactory {
//生产手机
IphoneProduct productPhone();
//生产路由器
IRouterProduct productRouter();
}
//小米工厂
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/6/27 0027 16:55
*/
public class XiaomiFactory implements IproductFactory {
@Override
public IphoneProduct productPhone() {
return new XiaoMiPhone();
}
@Override
public IRouterProduct productRouter() {
return new XiaomiRouter();
}
}
//华为工厂
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/6/27 0027 16:56
*/
public class HuaweiFactory implements IproductFactory {
@Override
public IphoneProduct productPhone() {
return new HuaweiPhone();
}
@Override
public IRouterProduct productRouter() {
return new HuaweiRouter();
}
}
优点
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。
使用场景
: 1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 3、设计一个连接服务器的框架,需要三个协议,“POP3”、“IMAP”、“HTTP”,可以把这三个作为产品类,共同实现一个接口