01个人理解
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的
工厂模式顾名思义,如果说Java敲代码产生的对象为产品,工厂模式产生一个好比工厂的就是代替你自己去生产对象,一个良好的工厂模式可以让客户在使用时可以根据自己的需要去生产一个适合的对象,而不用去修改代码。
02简单的工厂模式
创建一个简单的工厂去生产一种东西,建立一个工厂去生产一个函数或一个类方法来new一个新的对象。
例子:
现在模拟一个小汽车作为一个对象的生产过程
之前要生产两辆车必须客户自己去选择new ,现在讲new的过程放近一个工厂类中
import java.util.Scanner;
interface Car{
void createCar(); //汽车总接口 汽车这一类
}
class BMW implements Car{ //BMW
public void createCar(){
System.out.println("生产一个BMW");
}
}
class AuDi implements Car{ //AuDi
public void createCar(){
System.out.println("生产一个AuDi");
}
}
class Factory{ //汽车工厂方法 作用选择性的生产 汽车对象
public static Car getNewCar(String type){
if(type.equals("BMW")){
return new BMW();
}else if(type.equals("AuDo")){
return new AuDi();
}
return null;
}
}
public class Test{
public void buyCar(Car car){
car.createCar(); //根据对象打印适合方法
}
public static void main(String[] args){
Test test = new Test();
Scanner scanner = new Scanner(System.in);
System.out.println("输入想买的车");
String type = scanner.next();
Car car = Factory.getNewCar(type);
test.buyCar(car);
}
}
一个简单的工厂模式 方便去让本身自己实现根据选择new一个新的对象
但是如果说要添加一个新的汽车 还得返回修改大片代码过于死板
但是也开发了一个新的思路 一个程序不只是用来生产汽车也可以用来生产其他东西用来横向拓展。
例如问题尴尬到要是实在想去添加一种新的汽车或者一种新的类型,我们最好的选择是去添加而不是修改,所以可以将工厂类也可以用这种思想去拆分
interface Factory{
Car createCar();
}
class BMW4S implements Factory{
public Car createCar(){
return new BMW();
}
}
class AuDi4s implements Factory{
public Car createCar(){
return new AuDi();
}
}
//test
public static void main(String[] argss){
Test test = new Test();
Factory factory = new BMW4S();
test.buyCar(factory.createCar());
}
直接结果就是所有的类都为一个模块,各个模块之间的联系或为接口 或为方法,一层一层添加一个新的类型时候不用过多的修改其他代码,而只需要添加。
03抽象工厂模式
简单工厂模式有点明显,缺点更明显使得客户程序中仅仅处理抽象产品角色提供的接口,但使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象。
引入抽象工厂模式 就是为了更加简化问题 懒是人类进步的阶梯
例子:我们还是生产汽车而且这一次还对汽车做一些特殊要求,例如发动机 或者 内饰甚至是价格
在简单工厂的基础上 让一个工厂类不再承担一种类型对象的生产
import java.util.Scanner;
interface Car{
void printCar(); //汽车总接口 汽车这一类
}
class BMW implements Car{ //BMW
public void printCar(){
System.out.println("这是一个BMW");
}
}
class AuDi implements Car{ //AuDi
public void printCar(){
System.out.println("这是一个AuDi");
}
}
interface PortCar{ //进口汽车接口
void printMation();
}
class ChinaCar implements PortCar{ //国产类
public void printMation(){
System.out.println("国产汽车");
}
}
class USACar implements PortCar{ //进口汽车
public void printMation(){
System.out.println("美国进口汽车");
}
}
interface Factory{ //工厂
Car createCar();
PortCar printMation();
}
class BMWFactory implements Factory{ //包装国产宝马
public Car createCar(){
return new BMW();
}
public PortCar printMation(){
return new ChinaCar();
}
}
class AuDiFactory implements Factory{ //包装进口奥迪
public Car createCar(){
return new AuDi();
}
public PortCar printMation(){
return new USACar();
}
}
public class Test{
public void buyCar(Car car){
car.printCar(); //根据对象打印适合方法
}
public void buyGrade(PortCar port){
port.printMation();
}
public static void main(String[] argss){
Test test = new Test();
Factory fact = new BMWFactory();
Car car = fact.createCar();
PortCar port = fact.printMation();
test.buyCar(car);
test.buyGrade(port);
}
}
先写到这里随着以后使用的深入再加补充
生命不息!!!奋斗不止!!!