简单工厂模式
- 该模式对对象创建管理方式最为简单,因为其仅仅简单的对不同类对象的创建进行了一层薄薄的封装。该模式通过向工厂传递类型来指定要创建的对象,其UML类图如下:
下面使用代码来阐述:
package com.zhouyou.factory.simple;
public class FactoryCar {
public static Car getCar(String car){
if(car.equals("大众")){
return new dazhongCar();
}
else if(car.equals("奥迪")){
return new AodiCar();
}else {
return null;
}
}
public static Car getDaZhong(){
return new dazhongCar();
}
}
public class dazhongCar implements Car {
@Override
public void name() {
System.out.println("大众");
}
}
public class Consumer {
public static void main(String[] args) {
Car car1 = FactoryCar.getCar("大众");
Car car2 = FactoryCar.getCar("奥迪");
car1.name();
car2.name();
Car daZhong = FactoryCar.getDaZhong();
daZhong.name();
}
}
总结:用来生产同一等级结构中任意产品, 缺点:如果增加新的产品,需要重新修改代码结构
工厂方法模式
- 和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂,其UML类图如下:
也就是定义一个抽象工厂,其定义了产品的生产接口,但不负责具体的产品,将生产任务交给不同的派生类工厂。这样不用通过指定类型来创建对象了。
- 接下来继续使用生产汽车的例子来讲解该模式。 car和AodiCar类和上述相同
//相当于中间多了一层,但是扩展性增加了
public interface FactoryCar {
Car getCar();
}```
```java
public class AodiFactory implements FactoryCar{
@Override
public Car getCar() {
return new AodiCar();
}
}
public class Consumer {
public static void main(String[] args) {
new AodiFactory().getCar().name();
}
}
用来生产同一登记结构中的固定产品,横向
抽象工厂模式
工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。本文从一个具体的例子逐步深入分析,来体会三种工厂模式的应用场景和利弊。
优点十分明显,缺陷也十分明显,每次增加产品族时,所有超级工厂下的类都要新增实现
贴上代码:
package com.zhouyou.factory.abstract1;
public interface ProductFactory {
PhoneProduct phoneProduct();
RouteProduct routeProduct();
}
package com.zhouyou.factory.abstract1;
public interface RouteProduct{
void openWifi();
void setting();
}
package com.zhouyou.factory.abstract1;
public interface PhoneProduct {
void start();
void shutdown();
void call();
void sms();
}
package com.zhouyou.factory.abstract1;
public class XiaomiFactory implements ProductFactory{
@Override
public PhoneProduct phoneProduct() {
return new XiaomiPhone();
}
@Override
public RouteProduct routeProduct() {
return new XiaomiRoute();
}
}
package com.zhouyou.factory.abstract1;
public class HuaweiFactory implements ProductFactory{
@Override
public PhoneProduct phoneProduct() {
return new HuaweiPhone();
}
@Override
public RouteProduct routeProduct() {
return new HuaweiRoute();
}
}
package com.zhouyou.factory.abstract1;
public class XiaomiPhone implements PhoneProduct{
@Override
public void start() {
System.out.println("小米开机");
}
@Override
public void shutdown() {
System.out.println("小米关机");
}
@Override
public void call() {
System.out.println("小米打电话");
}
@Override
public void sms() {
System.out.println("小米发短信");
}
}
package com.zhouyou.factory.abstract1;
public class HuaweiPhone implements PhoneProduct{
@Override
public void start() {
System.out.println("华为开机");
}
@Override
public void shutdown() {
System.out.println("华为关机");
}
@Override
public void call() {
System.out.println("华为打电话");
}
@Override
public void sms() {
System.out.println("华为发短信");
}
}
package com.zhouyou.factory.abstract1;
public class client {
public static void main(String[] args) {
System.out.println("===============小米系列===============");
XiaomiFactory xiaomiFactory = new XiaomiFactory();
PhoneProduct phoneProduct = xiaomiFactory.phoneProduct();
phoneProduct.sms();
phoneProduct.call();
System.out.println("===============华为系列");
HuaweiFactory huaweiFactory = new HuaweiFactory();
PhoneProduct phoneProduct1 = huaweiFactory.phoneProduct();
phoneProduct1.sms();
phoneProduct1.call();
}
}
- 学自B站:狂神说
- 谨以此记录学习,巩固记忆