前言
前排提示:这是一个学习笔记,参照马士兵老师和韩顺平老师设计模式的视频学习的笔记。记录下来纯为巩固和方便日后的复习!
参考:
韩顺平老师:https://www.bilibili.com/video/BV1G4411c7N4?from=search&seid=15531256878937056259
马士兵老师:https://www.bilibili.com/video/BV1tK411W7xx?from=search&seid=15531256878937056259
设计模式(序)——设计模式初识和原则
设计模式(一)——单例模式
设计模式(二)——策略模式
设计模式(三)——简单工厂和抽象工厂
六、工厂模式
任何可以产生对象的方法或者类都可以被称之为工厂,单例模式也是一种工厂。
由实例引出工厂模式
问题1:假设现在有一个工厂,能生产宝马、奔驰、奥迪等三个品牌汽车的零件,该如何设计?
思路:首先我们可以通过面向对象中多态的理念来实现这一问题。编写一个接口里面有一个生产零件的方法。编写奔驰、宝马和奥迪三个类来实现这一接口。然后在主方法中药什么汽车的零件就new什么汽车的零件即可。
实现步骤:
第一步:创建接口
public interface ProductionParts {
void create();
}
第二步:创建三个类,来实现接口,为了简洁这里只展出其中的一个类
public class Mercedes implements ProductionParts {
@Override
public void create() {
System.out.println("Mercedes开始制造......");
}
}
在主类中测试
public class Main {
public static void main(String[] args) {
ProductionParts parts = new Mercedes();
// ProductionParts parts = new Audi();
// ProductionParts parts = new BMW();
parts.create();
}
}
问题2:假设我们要让第一第二号流水线生产奔驰的零件,第三第五号流水线生产宝马的零件等,并且隔一段时间流水线生产的汽车品牌零件可能会变。该如何设计?
思路:这时我们可以定义一个父类,在父类中可以创建三个品牌,在创建品牌之前我们可以为其定制流水线
实现步骤:
第一步:创建父类
public class VehicleFactory {
public Mercedes createMercedes(){
//定制流水线等操作
System.out.println("三、四号流水线。。");
return new Mercedes();
}
public BMW createBMW(){
System.out.println("一、五号流水线。。");
return new BMW();
}
public Audi createAudi(){
//.....
return new Audi();
}
}
在主类中测试
public class Main {
public static void main(String[] args) {
BMW bmw = new VehicleFactory().createBMW();
bmw.create();
}
}
总结
以上两个问题的综合解决方案就是工厂模式。
工厂模式的优点:
- 简单易实现
- 当我们需要什么对象时,只需要知道对象名就可以从工厂中获取
工厂模式的缺点: - 拓展性差,每多一个品牌,就要添加一个类
七、抽象工厂
由实例引出抽象工厂
思考:由前面的简单工厂模式引发进一步思考,假设这家工厂拓展业务了,不仅可以生产汽车的零件(如车门和车轮),还能生产公交车零件(车门和车轮)时,该如何设计
先构建生产车轮的工厂和生产车门的工厂————抽象产品
public abstract class TireFactory {
abstract void createtire();
}
public abstract class DoorFactory {
abstract void createdoor();
}
编写生产公交车车门和车轮的实际方法和编写汽车车门和车轮的实际方法————具体产品
public class BusDoor extends DoorFactory{
@Override
public void createdoor(){
System.out.println("生产公交车车门");
}
}
public class BusTire extends TireFactory{
@Override
public void createtire(){
System.out.println("生产公交车轮胎");
}
}
public class CarDoor extends DoorFactory{
@Override
public void createdoor() {
System.out.println("生产汽车车门");
}
}
public class CarTire extends TireFactory {
@Override
public void createtire(){
System.out.println("生产汽车轮胎");
}
}
构建一个抽象工厂可以用来生产车门和车轮————抽象工厂
public abstract class AbstractFactory {
abstract DoorFactory CreateDoor();
abstract TireFactory CreateTire();
}
编写具体的公交车工厂和汽车工厂————具体工厂
public class BusFactory extends AbstractFactory {
@Override
DoorFactory CreateDoor() {
return new BusDoor();
}
@Override
TireFactory CreateTire() {
return new BusTire();
}
}
public class CarFactory extends AbstractFactory {
@Override
DoorFactory CreateDoor() {
return new CarDoor();
}
@Override
TireFactory CreateTire() {
return new CarTire();
}
}
主类测试
public class Main {
public static void main(String[] args) {
AbstractFactory busfactory = new BusFactory();
DoorFactory busdoor = busfactory.CreateDoor();
busdoor.createdoor();
TireFactory bustire = busfactory.CreateTire();
bustire.createtire();
AbstractFactory carfactory = new CarFactory();
DoorFactory cardoor = carfactory.CreateDoor();
cardoor.createdoor();
TireFactory cartire = carfactory.CreateTire();
cartire.createtire();
}
}
总结
抽象模式是对简单工厂的进一步改造,抽象工厂基本上由四个模块组成:抽象产品、抽象工厂、具体产品和具体工厂。
优点:
- 扩展性比简单工厂强
- 能够将一系列的产品统一创建
缺点:
- 规定了所有可能被创建的产品集合,产品簇中扩展新的产品困难
- 增加了系统的抽象性和理解难度