设计模式-工厂
工厂方法模式(Factory Method),又称多态性工厂模式,属于设计模式三大分类中的创建型模式,作为抽象工厂模式的孪生兄弟,工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,也就是说工厂模式让实例化推迟到子类。
优点:用户只需要关系所需产品对应的工厂,无须关心创建细节;加入新产品符合开闭原则,提高可扩展性。
缺点:类的个数容易过多,增加复杂度;增加了系统的抽象性和理解难度。
/**
简单工厂模式
*/
public class factory {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
//获取 Circle 的对象,并调用它的 draw 方法
Shape shape1 = shapeFactory.getShape("CIRCLE");
//调用 Circle 的 draw 方法
shape1.draw();
//获取 Rectangle 的对象,并调用它的 draw 方法
Shape shape2 = shapeFactory.getShape("RECTANGLE");
//调用 Rectangle 的 draw 方法
shape2.draw();
//获取 Square 的对象,并调用它的 draw 方法
Shape shape3 = shapeFactory.getShape("SQUARE");
//调用 Square 的 draw 方法
shape3.draw();
}
}
interface Shape {
void draw();
}
class ShapeFactory {
//使用 getShape 方法获取形状类型的对象
public Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
} else if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
} else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
}
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
class Square implements Shape {
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
/**
抽象工厂
*/
public class abstractFactory {
public static void main(String[] args) {
System.out.println("===================小米系列产品=================");
//小米产品工厂实例
IProductFactory xiaomiProductFactory = new XiaomiProductFactory();
IRouterProduct iRouterProduct = xiaomiProductFactory.produceRouter();
iRouterProduct.start();
iRouterProduct.shutdown();
iRouterProduct.openWifi();
iRouterProduct.setting();
//生产小米手机
IPhoneProduct xiaomiPhone = xiaomiProductFactory.produceTelPhone();
xiaomiPhone.start();
xiaomiPhone.callUp();
xiaomiPhone.sendSMS();
xiaomiPhone.shutdown();
System.out.println("===================华为系列产品=================");
//华为产品工厂实例
IProductFactory huaweiProductFactory = new HuaweiProductFactory();
//生产华为路由器
IRouterProduct huaweiRouter = huaweiProductFactory.produceRouter();
huaweiRouter.start();
huaweiRouter.setting();
huaweiRouter.openWifi();
huaweiRouter.shutdown();
//生产华为手机
IPhoneProduct huaweiPhone = huaweiProductFactory.produceTelPhone();
huaweiPhone.start();
huaweiPhone.callUp();
huaweiPhone.sendSMS();
huaweiPhone.shutdown();
}
}
/**
* 手机产品接口
*/
interface IPhoneProduct {
/**
* 开机
*/
void start();
/**
* 关机
*/
void shutdown();
/**
* 拨打电话
*/
void callUp();
/**
* 发送短信
*/
void sendSMS();
}
/**
* 路由器产品接口
*/
interface IRouterProduct {
/**
* 开机
*/
void start();
/**
* 关机
*/
void shutdown();
/**
* 开启wifi
*/
void openWifi();
/**
* 设置参数
*/
void setting();
}
/**
* 抽象产品工厂(定义了同一个产品族的产品生产行为)
*/
interface IProductFactory {
/**
* 生产手机
* @return
*/
IPhoneProduct produceTelPhone();
/**
* 生产路由器
* @return
*/
IRouterProduct produceRouter();
}
/**
* 华为手机产品
*/
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("用华为手机发短信");
}
}
/**
* 华为路由器产品
*/
class HuaweiRouter 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("设置华为路由器参数");
}
}
/**
* 小米手机产品
*/
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("用小米手机发短信");
}
}
/**
* 小米路由器产品
*/
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("设置小米路由器参数");
}
}
/**
* 华为产品工厂
*/
class HuaweiProductFactory implements IProductFactory{
@Override
public IPhoneProduct produceTelPhone() {
System.out.println(">>>>>>生产华为手机");
return new HuaweiPhone();
}
@Override
public IRouterProduct produceRouter() {
System.out.println(">>>>>>生产华为路由器");
return new HuaweiRouter();
}
}
/**
* 小米产品工厂
*/
class XiaomiProductFactory implements IProductFactory {
@Override
public IPhoneProduct produceTelPhone() {
System.out.println(">>>>>>生产小米手机");
return new XiaomiPhone();
}
@Override
public IRouterProduct produceRouter() {
System.out.println(">>>>>>生产小米路由器");
return new XiaomiRouter();
}
}
```