java23模式
创建型模式 5种
1.抽象工厂模式
1.啥是抽象工厂
抽象工厂就是一个超级工厂,用来创建其他工厂的一个工厂,因为他是创建其他工厂的工厂,所以他属于创建型的模式。
抽象工厂中接口负责创建一个相关对象的工厂,不需要指定他们的类,每个生成的工厂都会按照工厂模式给我们提供对象
目的:
给我们提供一个创建系列的相关或者相互依赖的接口,而无需指定他们的具体的类。因此他解决接口选择的问题。关键在于一个工厂中聚合多个同类产品,就是一个产品族里定义多个产品型号。
例如我家很钱,我有很多品牌的汽车,有奔驰、有牧马人、我的牧马人仓库只放置牧马人,奔驰车库只能停置奔驰。我所有的车库就是一个抽象工厂(接口),我具体的牧马人车库就是个具体的工厂,还有我的奔驰汽车又有不同型号,不同型号的奔驰又组成一个抽象产品。
优点:
产品族中多个对象被设计成在一起工作时,它能保证客户端始终使用同一个产品族中的对象 。
缺点:
扩展一个产品族太困难,因为扩展一个产品系既要在抽象块中编写代码,又要在具体的产品工厂中添加代码。
实现
步骤一:创建产品接口以及产品的方法
public interface Color { //颜色填充 void fill(); } //2 public interface Shape { //形状接口 void draw(); }
步骤二:分别创建颜色、形状的实现类,实现方法
public class Blue implements Color { @Override public void fill() { System.out.println("填充蓝色Blue.fill"); } } public class Green implements Color { @Override public void fill() { System.out.println("填充绿色Green.fill"); } } Red --- Shape: public class Circle implements Shape{ @Override public void draw() { System.out.println("画原型方法Circle.draw"); } } Rectangle Square
步骤三:创建颜色形状抽象工厂
public abstract class AbstractFactory { public abstract Color getColor(String color); public abstract Shape getShape(String shape); }
步骤四:分别用颜色形状工厂实现抽象工厂
public class ColorFactory extends AbstractFactory { @Override public Color getColor(String color) { // todo color if (color==null){ return null; } if (color.equals("RED")){ return new Red(); }else if (color.equals("Green")){ return new Green(); }else if (color.equals("Blue")){ return new Blue(); } return null; } @Override public Shape getShape(String shape) { return null; } } --- public class ShapeFactory extends AbstractFactory { @Override public Color getColor(String color) { return null; } @Override public Shape getShape(String shape) { //TODO shanpe if (shape==null){ return null; }if (shape.equals("Circle")){ return new Circle(); }else if (shape.equals("Rectangle")){ return new Rectangle(); }else if (shape.equals("Square")){ return new Square(); } return null; } }
步骤五:创建生产者
public class FactoryProducer { public static AbstractFactory getFactory(String choice) { if (choice.equalsIgnoreCase("SHAPE")) { return new ShapeFactory(); } else if (choice.equalsIgnoreCase("Rectangle")){ return new ColorFactory(); } return null; } }
步骤六:测试
public class FactoryTest { public static void main(String[] args) { AbstractFactory abstractFactory = FactoryProducer.getFactory("SHAPE"); Shape shape = abstractFactory.getShape("Square"); shape.draw(); } }
**Result:**画正方形Square.draw
工厂方法模式
1.啥是工厂模式
工厂模式是最常用的一个创建型的设计模式,他不会暴露给客户端我们创建对象的创建逻辑,通过一个共同的接口来执行创建的对象。
目的
定义一个接口,让子类决定实例化哪个工厂类,是创建过程延迟到了子类中进行,解决了接口选择的问题。
例如:我们知道不同条件下生产不同对象,象我去面包店买面包,我们只需要拿面包,付钱就行,不用去管理面包的制作过程。
优点
- 访问者只需要告诉面包店面包的名字叫啥就行。
- 扩展容易,只需要扩展一个类就行了。
- 屏蔽了具体实现,调用者只用关心接口就行。
缺点
- 由于需要一个产品就要新创建一个类,使得类的数量太多,同时增加了欧耦合度。
实现
步骤一:创建产品接口
public interface Car { void run(); }
步骤二:创建实现类
public class Benz implements Car { @Override public void run() { System.out.println("奔驰Benz.run"); } } --- BWM Rabinson
步骤四:创建汽车工厂
public class CarFactory { public Car createCar(String car){ if (car==null){ return null; } if (car.equalsIgnoreCase("benz")){ return new Benz(); }else if (car.equalsIgnoreCase("bwm")){ return new BWM(); }else if (car.equalsIgnoreCase("rabinson")){ return new Rabinson(); } return null; } }
步骤五:创建测试类
public class CarTest { public static void main(String[] args) { CarFactory carFactory = new CarFactory(); Car benz = carFactory.createCar("benz"); benz.run(); } }
result
奔驰Benz.run