//定义工厂要创建的产品的接口,就是给产品定义规范
public interface Car {
//什么品牌的汽车
public void name();
//什么颜色的汽车
public void color();
}
//要生产的产品1
public class Benz implements Car{
private String name;
private String color;
public Benz(String name, String color) {
this.name = name;
this.color = color;
}
public void name() {
System.out.println("创建了"+name+"汽车");
}
public void color() {
System.out.println("是"+color+"的");
}
}
//要生产的产品2
public class BMW implements Car{
private String name;
private String color;
public BMW(String name, String color) {
this.name = name;
this.color = color;
}
public void name() {
System.out.println("创建了"+name+"汽车");
}
public void color() {
System.out.println("是"+color+"的");
}
}
//要生产的产品3
public class Audi implements Car{
private String name;
private String color;
public Audi(String name, String color) {
this.name = name;
this.color = color;
}
public void name() {
System.out.println("创建了"+name+"汽车");
}
public void color() {
System.out.println("是"+color+"的");
}
}
//工厂类
public class CarFactory {
public Car createCar(String type) throws Exception {
if("Benz".equals(type)){
return new Benz("奔驰","黑色");
}else if("BMW".equals(type)){
return new BMW("宝马","红色");
}else if("Audi".equals(type)){
return new Audi("奥迪","白色");
}else{
throw new Exception("参数错误");
}
}
}
//应用者:
public class Test {
public static void main(String[] args) throws Exception {
CarFactory factory = new CarFactory();
Car car = factory.createCar("BMW");
car.name();
car.color();
System.out.println("=================================================");
CarFactory factory2 = new CarFactory();
Car car2 = factory.createCar("Audi");
car2.name();
car2.color();
}
}
客户只需要关心工厂需要什么参数,传入正确的参数,就可以创建对象了,不用知道对象创建的具体过程。
弊端:需要创建更多类型的产品时,需要对该工厂模式代码进行修改。如何创建BYD汽车?只能修改工厂源码,多个判断,那就意味需要修改源码,重建工厂,不合适。所以引入工厂模式。
将工厂改成抽象类,可以新建有多个工厂,不影响老工厂。
//定义工厂要创建的产品的接口,就是给产品定义规范
public interface Car {
public void name();
public void color();
}
//产品1
public class Benz implements Car {
private String name;
private String color;
public Benz(String name, String color) {
this.name = name;
this.color = color;
}
public void name() {
System.out.println("创建了"+name+"汽车");
}
public void color() {
System.out.println("是"+color+"的");
}
}
//产品2
public class BMW implements Car {
private String name;
private String color;
public BMW(String name, String color) {
this.name = name;
this.color = color;
}
public void name() {
System.out.println("创建了"+name+"汽车");
}
public void color() {
System.out.println("是"+color+"的");
}
}
//产品3
public class Audi implements Car {
private String name;
private String color;
public Audi(String name, String color) {
this.name = name;
this.color = color;
}
public void name() {
System.out.println("创建了"+name+"汽车");
}
public void color() {
System.out.println("是"+color+"的");
}
}
//产品4
public class BYD implements Car{
private String name;
private String color;
public BYD(String name, String color) {
this.name = name;
this.color = color;
}
public void name() {
System.out.println("创建了"+name+"汽车");
}
public void color() {
System.out.println("是"+color+"的");
}
}
//工厂不再生产具体产品,变为接口
public interface CarFactory {
public Car createCar();
}
//工厂1:
public class BeazCarFactory implements CarFactory{
public Car createCar() {
return new Benz("奔驰","黑色");
}
}
//工厂2
public class BMWCarFactory implements CarFactory{
public Car createCar() {
return new Benz("宝马","红色");
}
}
//工厂3
public class AudiCarFactory implements CarFactory{
public Car createCar() {
return new Benz("奥迪","白色");
}
}
//工厂4
public class BYDCarFactory implements CarFactory{
public Car createCar() {
return new Benz("比亚的","绿色");
}
}
//应用者
public static void main(String[] args) {
CarFactory carFactory = new BeazCarFactory();
Car car = carFactory.createCar();
car.name();
car.color();
System.out.println("===========================");
CarFactory carFactory2 = new BYDCarFactory();
Car car2 = carFactory2.createCar();
car2.name();
car2.color();
}
优点:需要创建的产品变化时,不需要改源码,只需要添加一个对应的工厂(类)即可,因为工厂已经变为接口,可以有多个实现类(满足大多数应用)。
缺点:当生产的产品的颜色和品牌都增加时怎么办?改为抽象工厂模式。
意味着:当产品的等级有多个分类时需要抽象工厂,当产品等级单一时工厂模式即可
将要生产什么类型?什么品牌?全部抽象:就是抽象工厂。
//定义产品
public interface Chanpin {
public abstract void color();
public abstract void pinpai();
}
//产品颜色分类1
public abstract class Chanpin1 implements Chanpin{
public void color(){
System.out.println("黑色");
}
public abstract void pinpai();
}
//产品颜色分类2
public abstract class Chanpin2 implements Chanpin{
public void color(){
System.out.println("红色");
}
public abstract void pinpai();
}
//产品颜色分类3
public abstract class Chanpin3 implements Chanpin{
public void color(){
System.out.println("白色");
}
public abstract void pinpai();
}
//产品颜色分类1对应的具体产品1
public class Benz extends Chanpin1{
public void pinpai(){
System.out.println("生产了奔驰");
}
}
//产品颜色分类1对应的具体产品2
public class BMW extends Chanpin1{
public void pinpai(){
System.out.println("生产了宝马");
}
}
//产品颜色分类1对应的具体产品3
public class Audi extends Chanpin1{
public void pinpai(){
System.out.println("生产了奥迪");
}
}
//产品颜色分类2对应的具体产品1
public class Benz2 extends Chanpin2{
public void pinpai(){
System.out.println("生产了奔驰");
}
}
//产品颜色分类2对应的具体产品2
public class BMW2 extends Chanpin2{
public void pinpai(){
System.out.println("生产了宝马");
}
}
//产品颜色分类2对应的具体产品3
public class Audi2 extends Chanpin2{
public void pinpai(){
System.out.println("生产了奥迪");
}
}
//产品颜色分类3对应的具体产品1
public class Benz3 extends Chanpin3{
public void pinpai(){
System.out.println("生产了奔驰");
}
}
//产品颜色分类3对应的具体产品2
public class BMW3 extends Chanpin3{
public void pinpai(){
System.out.println("生产了宝马");
}
}
//产品颜色分类3对应的具体产品3
public class Audi3 extends Chanpin3{
public void pinpai(){
System.out.println("生产了奥迪");
}
}
所有的产品分类:
interface Chanpin{
public abstract void color();
public abstract void pinpai();
}
abstract class:
Chanpin1:黑色
Chanpin2:红色
Chanpin3:白色
class:
Benz:奔驰
bmw:宝马
audi:奥迪
Benz2:奔驰
bmw2:宝马
audi2:奥迪
Benz3:奔驰
bmw3:宝马
audi3:奥迪
====================================================
//抽象工厂:
public interface Factory {
public Chanpin createBenz();
public Chanpin createBMW();
public Chanpin createAudi();
}
//抽象工厂子工厂1:
public class BlackFactory implements Factory {
public Chanpin createBenz(){
return new Benz();
}
public Chanpin createBMW(){
return new BMW();
}
public Chanpin createAudi(){
return new Audi();
}
}
//抽象工厂子工厂2:
public class RedFactory implements Factory {
public Chanpin createBenz(){
return new Benz2();
}
public Chanpin createBMW(){
return new BMW2();
}
public Chanpin createAudi(){
return new Audi2();
}
}
//抽象工厂子工厂3:
public class WhiteFactory implements Factory {
public Chanpin createBenz(){
return new Benz3();
}
public Chanpin createBMW(){
return new BMW3();
}
public Chanpin createAudi(){
return new Audi3();
}
}
public class Test{
public static void main(String[] args){
Factory factory1 = new WhiteFactory();
Chanpin c1 = factory1.createBenz();
Factory factory2 = new RedFactory();
Chanpin c2 = factory2.createBMW();
}
}