java设计模式2————工厂模式
1、工厂模式介绍:
1.1、实现了创建者与调用者的分离
1.2、详细分类:
简单工厂模式
工厂方法模式
抽象工厂模式
1.3、所遵循的OOP原则:
开闭原则:对扩展开放,对修改关闭
依赖倒转原则:面向接口编程
迪米特法则:只与你直接的朋友进行通信,而避免与陌生人进行通信。
1.4、核心本质
实例化对象,不使用new,用工厂方法代替
将调用者与我们的实现类解耦
1.5、三种模式
2、简单工厂模式
2.1、先建立汽车抽象类
package com.xgp.company.第二种_工厂模式.简单工厂模式;public interface Car {
void name();
}
2.2、制造车
制造“五凌”车
package com.xgp.company.第二种_工厂模式.简单工厂模式;
public class WuLing implements Car {@Overridepublic void name() {System.out.println("五凌宏观");}}
制造“特斯拉”车
package com.xgp.company.第二种_工厂模式.简单工厂模式;
public class Tesla implements Car {@Overridepublic void name() {System.out.println("特斯拉");}}
2.3、创建汽车工厂(两种方式工厂制造对像)
package com.xgp.company.第二种_工厂模式.简单工厂模式;
/**
* 简单工厂模式,又成为静态工厂模式
* 弊端:增加一个新产品时,如果你不修改代码,做不到
*//**
汽车工厂
*/
public class CarFactory {
public static Car getCar(String car) {
if("五凌".equals(car)) return new WuLing();
if("特斯拉".equals(car)) return new Tesla();
return null;
}/**
public static Car getTesla() {
return new Tesla();
}
}第二种方式
@return
*/
public static Car getWuLing() {
return new WuLing();
}
2.4、建立买车类(传统方法创建对象被注释了和通过工厂创建对象)
package com.xgp.company.第二种_工厂模式.简单工厂模式;/**
买车
/
public class Consumer {
/ //*/**
简单工厂模式
@param args
*/
public static void main(String[] args) {
Car car1 = CarFactory.getCar("五凌");
Car car2 = CarFactory.getCar("特斯拉");car1.name();
car2.name();
}
}传统的方式
@param args
//
public static void main(String[] args) {
//弊端:需要了解接口和所有的实现类
Car car1 = new WuLing();
Car car2 = new Tesla();car1.name();
car2.name();
}*/
2.5、缺点:如果要增加一个“大众”的汽车,还需要修改工厂代码
package com.xgp.company.第二种_工厂模式.简单工厂模式;/**
弊端:增加实现类时需要改工厂类的代码
*/
public class Dazhong implements Car {
@Override
public void name() {
System.out.println("大众");
}
}
2.6、运行结果
五凌宏观 特斯拉
2.7、UML类图
3、工厂方法模式
3.1、建立汽车抽象类
package com.xgp.company.第二种_工厂模式.工厂方法模式;public interface Car {
void name();
}
3.2、创建车
创建“五凌”车
package com.xgp.company.第二种_工厂模式.工厂方法模式;
public class WuLing implements Car {@Overridepublic void name() {System.out.println("五凌宏观");}}
创建“特斯拉”车
package com.xgp.company.第二种_工厂模式.工厂方法模式;
public class Tesla implements Car {@Overridepublic void name() {System.out.println("特斯拉");}}
3.3、创建汽车工厂的抽象类
package com.xgp.company.第二种_工厂模式.工厂方法模式;
public interface CarFactory {Car getCar();}
3.4、创建汽车工厂
创建制造“五凌”车的汽车工厂
package com.xgp.company.第二种_工厂模式.工厂方法模式;public class WuLingFactory implements CarFactory {
@Override
public Car getCar() {
return new WuLing();
}
}
创建制造“特斯拉”车的汽车工厂
package com.xgp.company.第二种_工厂模式.工厂方法模式;
public class TeslaFactory implements CarFactory {@Overridepublic Car getCar() {return new Tesla();}}
3.5、新增一辆“大众”车
新增一辆“大众”车
package com.xgp.company.第二种_工厂模式.工厂方法模式;/**
弊端:增加实现类时需要改工厂类的代码
*/
public class Dazhong implements Car {
@Override
public void name() {
System.out.println("大众");
}
}
新增一辆“大众”车的汽车工厂
package com.xgp.company.第二种_工厂模式.工厂方法模式;
public class DazhongFactory implements CarFactory {@Overridepublic Car getCar() {return new Dazhong();}}
3.6、创建消费者类
package com.xgp.company.第二种_工厂模式.工厂方法模式;/**
买车
*/
public class Consumer {
public static void main(String[] args) {
Car car1 = new WuLingFactory().getCar();
Car car2 = new TeslaFactory().getCar();
Car car3 = new DazhongFactory().getCar();car1.name(); car2.name(); car3.name();
}
//根据设计原则:工厂方法模式
//更据实际业务:简单工厂模式
}
3.7、弊端:增加实现类时需要改工厂类的代码
总结:
根据设计原则:工厂方法模式
更据实际业务:简单工厂模式
3.8、UML类图
4、小节
5、抽象工厂模式
5.1、该模式介绍
5.2、UML类图设计
5.3、创建生产产品种类的抽象类
package com.xgp.company.第二种_工厂模式.抽象工厂模式;/**
抽象产品工厂
*/
public interface IProductFactory {
//生产手机
IPhoneProduct iphoneProduct();//生产路由器
IRouterProduct routerProduct();
}
5.4、创建手机和路由器的抽象接口
手机:
package com.xgp.company.第二种_工厂模式.抽象工厂模式;/**
手机接口
*/
public interface IPhoneProduct {
void start(); //开机
void shutdown(); //关机
void callup(); //打电话
void sendSMS(); //发短信
}
路由器:
package com.xgp.company.第二种_工厂模式.抽象工厂模式;/**
路由器产品接口
*/
public interface IRouterProduct {
void start(); //开机
void shutdown(); //关机
void openWifi(); //打开网络
void setting(); //设置参数
}
5.5、创建小米工厂
package com.xgp.company.第二种_工厂模式.抽象工厂模式;public class XiaomiFactory implements IProductFactory {@Overridepublic IPhoneProduct iphoneProduct() {return new XiaomiPhone();}
@Override
public IRouterProduct routerProduct() {
return new XiaomiRouter();
}
}
5.6、小米工厂制造小米手机、小米路由器
制造小米手机:
package com.xgp.company.第二种_工厂模式.抽象工厂模式;/**
小米手机
*/
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("小米发短信");
}
}
制造小米路由器:
package com.xgp.company.第二种_工厂模式.抽象工厂模式;/**
小米路由器
*/
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("小米网络");
}@Override
public void setting() {
System.out.println("小米参数");
}
}
5.7、创建华为工厂
package com.xgp.company.第二种_工厂模式.抽象工厂模式;public class HuaweiFactory implements IProductFactory {@Overridepublic IPhoneProduct iphoneProduct() {return new HuaweiPhone();}
@Override
public IRouterProduct routerProduct() {
return new HuaweiRouter();
}
}
5.8、华为工厂制造华为手机、华为路由器
制造华为手机:
package com.xgp.company.第二种_工厂模式.抽象工厂模式;/**
华为手机
*/
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("华为手机发短信");
}
}
制造华为路由器:
package com.xgp.company.第二种_工厂模式.抽象工厂模式;public class HuaweiRouter implements IRouterProduct {@Overridepublic void start() {System.out.println("开启华为路由器");}
@Override
public void shutdown() {
System.out.println("关闭华为路由器");
}
@Override
public void openWifi() {
System.out.println("华为网络");
}
@Override
public void setting() {
System.out.println("华为参数");
}
}
5.9、根据工厂制造产品
package com.xgp.company.第二种_工厂模式.抽象工厂模式;public class Client {public static void main(String[] args) {System.out.println("小米系列产品=");//小米工厂XiaomiFactory xiaomiFactory = new XiaomiFactory();
//小米手机
IPhoneProduct iphoneProduct = xiaomiFactory.iphoneProduct();
iphoneProduct.start();
iphoneProduct.callup();
iphoneProduct.sendSMS();
iphoneProduct.shutdown();
//小米路由器
IRouterProduct routerProduct = xiaomiFactory.routerProduct();
routerProduct.start();
routerProduct.openWifi();
routerProduct.setting();
routerProduct.shutdown();
System.out.println("================华为系列产品=================");
//华为工厂
HuaweiFactory huaweiFactory = new HuaweiFactory();
//华为手机
iphoneProduct = huaweiFactory.iphoneProduct();
iphoneProduct.start();
iphoneProduct.callup();
iphoneProduct.sendSMS();
iphoneProduct.shutdown();
//华为路由器
routerProduct = huaweiFactory.routerProduct();
routerProduct.start();
routerProduct.openWifi();
routerProduct.setting();
routerProduct.shutdown();
}
}
5.10、运行结果
================小米系列产品================= 开启小米手机 小米打电话 小米发短信 关闭小米手机 开启小米路由器 小米网络 小米参数 关闭小米路由器 ================华为系列产品================= 开启华为手机 华为手机打电话 华为手机发短信 关闭华为手机 开启华为路由器 华为网络 华为参数 关闭华为路由器
进程完成,退出码 0