工厂模式
工厂模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
工厂模式主要解决接口选择的问题,定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
实现:
1.创建一个接口:
public interface Car {
void Car();
}
2.创建实现接口的实体类
public class BMW implements Car {//宝马车
@Override
public void Car() {
System.out.println("BMW...");
}
}
public class AUDI implements Car {//奥迪车
@Override
public void Car() {
System.out.println("AUDI...");
}
}
3.创建一个工厂,通过 createCar方法生成汽车的实体类的对象。
public class CarFactory {
//传入车名称,工厂进行制造
public Car createCar(String Car){
if (Car == null){
return null;
}
if (Car.equalsIgnoreCase("AUDI")){
System.out.println("create AUDI");
return new AUDI();
}else if (Car.equalsIgnoreCase("BMW")){
System.out.println("create BMW");
return new BMW();
}
return null;
}
}
4.使用该工厂
public class FactoryDemo {
public static void main(String[] args) {
//实例化一个CarFactory类对象
CarFactory carFactory = new CarFactory();
//获取一个Car的对象AUDI
Car audi = carFactory.createCar("AUDI");
//调用该对象的Car方法
audi.Car();
//获取一个Car的对象BMW
Car bmw = carFactory.createCar("BMW");
//调用该对象的Car方法
bmw.Car();
}
}
运行结果:
抽象工厂模式
抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式。
抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下:
可以在抽象产品类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
当增加一个新的产品族时不需要修改原代码,满足开闭原则。
其缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。
1.创建抽象产品类
//创建鼠标接口
public interface Mouse {
public void showMouse();
}
//创建键盘接口
public interface Keybo {
public void showKeybo();
}
2.创建实现接口的具体产品类
戴尔鼠标类
public class DellMouse implements Mouse{
@Override
public void showMouse() {
System.out.println("DellMouse..");
}
}
惠普鼠标类
public class HPMouse implements Mouse{
@Override
public void showMouse() {
System.out.println("HPMouse..");
}
}
戴尔键盘类
public class DellKeybo implements Keybo{
@Override
public void showKeybo() {
System.out.println("DellKeybo..");
}
}
惠普键盘类
public class HPKeybo implements Keybo{
@Override
public void showKeybo() {
System.out.println("HPKeybo..");
}
}
3.创建抽象工厂
public abstract class AbstractFactory {
public abstract Mouse creatMouse();
public abstract Keybo creatKeybo();
}
4.实现抽象类来创建具体的工厂
实现戴尔工厂
public class DellFactory extends AbstractFactory{
@Override
public Mouse creatMouse() {
System.out.println("creat DellMouse..");
return new DellMouse();
}
@Override
public Keybo creatKeybo() {
System.out.println("creat DellKeybo..");
return new DellKeybo();
}
}
实现惠普工厂
public class HPFactory extends AbstractFactory{
@Override
public Mouse creatMouse() {
System.out.println("creat HPMouse..");
return new HPMouse();
}
@Override
public Keybo creatKeybo() {
System.out.println("creat HPKeybo..");
return new HPKeybo();
}
}
4.创建一个选择器,通过传入参数选择创建什么工厂
public class Choice {
public static AbstractFactory getFactory(String choice){
if (choice == null){
return null;
}
if (choice.equalsIgnoreCase("Dell")){
return new DellFactory();
}
if (choice.equalsIgnoreCase("HP")){
return new HPFactory();
}
return null;
}
}
5.使用工厂
创建一个戴尔工厂:
public class AbstractFactoryDemo {
public static void main(String[] args) {
//创建dell工厂
AbstractFactory abstractFactory = Choice.getFactory("dell");
Keybo keybo = abstractFactory.creatKeybo();
keybo.showKeybo();
Mouse mouse = abstractFactory.creatMouse();
mouse.showMouse();
}
}
结果如下:
创建一个惠普工厂:
public class AbstractFactoryDemo {
public static void main(String[] args) {
//创建hp工厂
AbstractFactory abstractFactory = Choice.getFactory("hp");
Keybo keybo = abstractFactory.creatKeybo();
keybo.showKeybo();
Mouse mouse = abstractFactory.creatMouse();
mouse.showMouse();
}
}
结果如下:
可以看出,创建不同的工厂我们只需要将传入选择器的参数改变即可。